JTable 中的 SetCaretPosition

SetCaretPosition in JTable

如何在 JTable 中设置插入符位置?

我知道 JTextField 有 setCaretPosition(n) 功能。但是我无法访问 JTable.

中的 JTextField

我希望 Table 文本插入符号位置等于文本长度。鼠标点击事件是可以的,但应该是正常位置。

我的代码:

public class TableTest extends javax.swing.JFrame
{

    public TableTest()
    {
        javax.swing.JTable jTable1 = new javax.swing.JTable();

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
                new Object[][]
                {
                    {
                        "This is too long text!", "This is too long text!",
                    },
                    {
                        "This is too long text!", "This is too long text!",
                    }
                },
                new String[]
                {
                    "Title 1", "Title 2",
                }
        )); 

        add(jTable1);

        pack();

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLocationRelativeTo(null);
    }
    public static void main(String args[])
    {
        new TableTest().setVisible(true);
    }

}

这 table 个单元格显示为: [这也太...]不过应该是[..长文!]

默认 "startEditing" 操作,建议 here,由 BasicTableUI 提供。它通常会选择您想要避免的所有文本。您可以在绑定到首选击键的自定义 Action 中调用 setCaretPosition()。下面的示例使用名称 "myEditing"Space 键。

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.JTextComponent;

/**
 * @see 
 */
public class TableTest {

    private void display() {
        JFrame f = new JFrame("TableTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultTableModel model = new DefaultTableModel(
            new String[][]{
                {"This is too long text!", "This is too long text!",},
                {"This is too long text!", "This is too long text!",}
            },
            new String[]{
                "Title 1", "Title 2",}
        ) {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return String.class;
            }
        };
        JTable table = new JTable(model) {

            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(320, 160);
            }
        };
        table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "myEditing");
        table.getActionMap().put("myEditing", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                table.editCellAt(table.getSelectedRow(), table.getSelectedColumn());
                Component editor = table.getEditorComponent();
                if (editor != null) {
                    editor.requestFocus();
                    if (editor instanceof JTextComponent) {
                        JTextComponent jtc = (JTextComponent) editor;
                        EventQueue.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                jtc.setCaretPosition(jtc.getDocument().getLength());
                            }
                        });
                    }
                }
            }
        });
        table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
        f.add(new JScrollPane(table));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new TableTest()::display);
    }
}

作为参考,之前的 version.

中显示了鼠标事件的类似方法

This table cells are shown: [This is too...] but it should be [..long text!]

这是在单元格中显示文本的渲染器。默认渲染器是 JLabel,当文本被截断时它将显示 ...。如果你想要 ... 在单元格的开头,那么你需要创建一个自定义渲染器。

查看 Left Dot Renderer 以了解执行此操作的渲染器。