表单元格编辑器在调用editCellAt时会显示编辑光标

时间:2015-08-04 04:02:47

标签: 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)
    {
        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);

问题是即使单元格处于编辑模式,光标也不会出现在文本字段中,直到用户单击。但是可以输入文字。

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

1 个答案:

答案 0 :(得分:2)

调用setVisible并不会使窗口突然显示,而是安排窗口在未来的某个时刻显示。

您可以使用requestFocusInWindowSwingUtilities#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,但那就是我