【问题标题】:Table cell editor does show editing cursor when called editCellAt表格单元格编辑器在调用 editCellAt 时确实显示编辑光标
【发布时间】:2015-08-04 04:02:47
【问题描述】:

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

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

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

这段代码有什么遗漏或错误吗?

【问题讨论】:

标签: java swing jtable


【解决方案1】:

调用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,但这就是我

【讨论】:

  • 两个建议都有效。是的 WindowListener 方法似乎好多了
  • 我遇到了同样的问题。但在 setVisible 之后很久。用SwingUtilities.invokeLater 包裹电话似乎没有帮助。 -- 单元格编辑有效,但除非您单击,否则没有光标。
  • 非常感谢!正是我要找的!
猜你喜欢
  • 2012-08-31
  • 2017-06-30
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多