【问题标题】:SetCaretPosition in JTableJTable 中的 SetCaretPosition
【发布时间】:2016-10-29 02:33:12
【问题描述】:

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

我知道 JTextField 有 setCaretPosition(n) 函数。但是我无法访问 JTable 中的 JTextField。

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

我的代码:

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);
    }

}

显示此表格单元格: [这也...]但应该是[..长文本!]

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布 SSCCE / MCVE,简短,可运行,可在局部变量中使用 JTable / XxxTableModel 的硬编码值进行编译,否则一切都是关于纯粹的猜测,提示 - 这种形式的问题不是在这里回答
  • 谢谢,我改进了我的问题。
  • @mKorbel:感谢您的严格审查。根据更新后的问题,我在下面提出了另一种方法。

标签: java swing jtable jtextfield


【解决方案1】:

默认"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 https://stackoverflow.com/a/38051001/230513
 */
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 中显示了鼠标事件的类似方法。

【讨论】:

  • 我想在默认位置而不是鼠标点击。可能吗?所有列和行的插入位置都应该是文本长度。
  • 我写了that 代码但没有任何改变。
  • 根据您的minimal reproducible example,我在上面提出了另一种方法。
  • @HalilİbrahimOymacı:很高兴你把它整理好了。详细了解标签的工作原理here
【解决方案2】:

显示此表格单元格:[This is too...] 但它应该是 [..long text!]

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2012-02-09
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多