Java 当调用editCellAt时,表格单元格编辑器不显示编辑光标

Java 当调用editCellAt时,表格单元格编辑器不显示编辑光标,java,swing,jtable,Java,Swing,Jtable,我有一个对话框,其中包含一个表。要求是在显示对话框时以可编辑模式显示单元格。下面是代码 class MyDialog extends JDialog { JTable tbl = new JTable(new Object[][]{new String[]{"a", "b"}, new String[]{"1", "2"}}, new String[]{"col1", "col2"}); public MyDialog(Frame frame) {

我有一个对话框,其中包含一个表。要求是在显示对话框时以可编辑模式显示单元格。下面是代码

class MyDialog extends JDialog
{
    JTable tbl = new JTable(new Object[][]{new String[]{"a", "b"}, new String[]{"1", "2"}},  new String[]{"col1", "col2"});    

    public MyDialog(Frame frame)
    {
        add(tbl);
        setSize(300, 300);

        tbl.setCellEditor(new DefaultCellEditor(new JTextField()));
    }

    @Override
    public void setVisible(boolean b)
    {
        super.setVisible(b);
        if(b)
        {
            tbl.editCellAt(tbl.getRowCount() - 1, tbl.getColumnCount() - 1);
        }
    }
}
下面是展示的方式

MyDialog d = new MyDialog(parent);
d.setLocationRelativeTo(btn);
d.setVisible(true);
问题是,即使单元格处于编辑模式,光标也不会出现在文本字段中,直到用户单击。但是文本可以打字


此代码中有任何遗漏或错误吗?

调用
setVisible
不会使窗口突然可见,而是将窗口安排为在将来某个时候可见

您可以使用
requestFocusInWindow
SwingUtilities#invokeLater
的组合来请求单元格编辑器在将来的某个时刻获得焦点,例如

@Override
public void setVisible(boolean b) {
    super.setVisible(b);
    if (b) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                tbl.editCellAt(tbl.getRowCount() - 1, tbl.getColumnCount() - 1);
                tbl.getEditorComponent().requestFocusInWindow();
            }
        });
    }
}

我也不想覆盖
setVisible
,而是使用
WindowListener
,但这就是我的问题,请尝试设置为
true
,并确保编辑器在窗口中确实有焦点。这两个建议都有效。是的,WindowListener方法似乎更好。我也有同样的问题。但很久以后,我们就可以看到了。在
SwingUtilities.invokeLater
中包装调用似乎没有帮助。-单元格编辑工作正常,但除非单击,否则没有光标。非常感谢!正是我要找的!