Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JTable中设置CaretPosition_Java_Swing_Jtable_Jtextfield - Fatal编程技术网

Java 在JTable中设置CaretPosition

Java 在JTable中设置CaretPosition,java,swing,jtable,jtextfield,Java,Swing,Jtable,Jtextfield,如何在JTable中设置插入符号位置 我知道JTextField有setCaretPosition(n)功能。但是我无法访问JTable中的JTextField 我希望表格文字插入符号位置等于文字长度。可以使用鼠标单击事件,但它应该是正常位置 我的代码: public class TableTest extends javax.swing.JFrame { public TableTest() { javax.swing.JTable jTable1 = new

如何在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);
    }

}
此表中的单元格如下所示: [这太…]但应该是[…长文本!]

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

导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入javax.swing.AbstractAction;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.KeyStroke;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.text.JTextComponent;
/**
*@见https://stackoverflow.com/a/38051001/230513
*/
公共类表格测试{
专用void display(){
JFrame f=新JFrame(“表格测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel=新的DefaultTableModel(
新字符串[][]{
{“这是太长的文字!”,“这是太长的文字!”,},
{“这是太长的文本!”,“这是太长的文本!”,}
},
新字符串[]{
“标题1”、“标题2”}
) {
@凌驾
公共类getColumnClass(int columnIndex){
返回字符串.class;
}
};
JTable表格=新JTable(型号){
@凌驾
公共维度getPreferredScrollableViewportSize(){
返回新尺寸(320160);
}
};
table.getInputMap();
table.getActionMap().put(“myEditing”,new AbstractAction()){
@凌驾
已执行的公共无效操作(操作事件e){
table.editCellAt(table.getSelectedRow(),table.getSelectedColumn());
组件编辑器=table.getEditorComponent();
如果(编辑器!=null){
requestFocus();
if(JTextComponent的编辑器实例){
JTextComponent jtc=(JTextComponent)编辑器;
invokeLater(新的Runnable(){
@凌驾
公开募捐{
setCaretPosition(jtc.getDocument().getLength());
}
});
}
}
}
});
table.putClientProperty(“JTable.autoStartsEdit”,Boolean.FALSE);
f、 添加(新JScrollPane(表));
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(newtabletest()::display);
}
}
为了便于参考,在前面的示例中显示了鼠标事件的类似方法

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

这是在单元格中显示文本的渲染器。默认呈现程序是一个
JLabel
,当文本被截断时,它将显示
。如果希望将
放在单元格的开头,则需要创建自定义渲染器


检查是否有执行此操作的渲染器。

我希望在默认位置不单击鼠标。可能吗?所有列和行的caretposition都应该是文本长度。我编写了代码,但没有做任何更改。根据您的建议,我建议了上面的另一种方法。@HalilİbrahimOymacı:很高兴您对其进行了排序。更多关于标签如何工作的信息。为了获得更好的帮助,请尽快发布一个SSCCE/MCVE,简短,可运行,可编译,带有局部变量中JTable/XxxTableModel的硬编码值,否则一切都是关于纯猜测的,提示-此形式的问题在此不可回答谢谢,我改进了我的问题。@mKorbel:谢谢您的批评性评论。根据更新后的问题,我在下面建议了另一种方法。
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);
    }
}