我有一个三列JTable:一个不可编辑的JTextField,一个可编辑的JTextArea和一个可编辑的JTextField。
我的问题是双重的。当我选中它们时,我希望最后两列是背景突出显示并准备编辑,带有可见光标。他们还使用特定的字体;因此自定义渲染器和编辑器。
如果我在其中一个单元格中单击两次,我会成功,但如果我使用键盘到达那里则不行。我可以从一个单元格到另一个单元格(感谢对JTextArea的setTraversalKeys调用)并开始输入,但焦点不明显。
我有一个焦点事件监听器,可以在触发它的任何组件上设置背景颜色。它用于JTextField和用于单元格编辑的JTextArea,以及用于测量的单元格渲染器。但只需点击鼠标即可触发它们。
如何确保在我正在选中的单元格中触发焦点事件?
感谢。
答案 0 :(得分:1)
您应该听取选择更改并在需要的地方开始编辑:
final JTable table = new JTable (
new String[][]{ { "col1", "col2", "col3" }, { "col1", "col2", "col3" } },
new String[]{ "1", "2", "3" } );
ListSelectionListener listener = new ListSelectionListener ()
{
public void valueChanged ( ListSelectionEvent e )
{
if ( table.getSelectedRow () != -1 && table.getSelectedColumn () != -1 )
{
table.editCellAt ( table.getSelectedRow (), table.getSelectedColumn () );
}
}
};
table.getColumnModel ().getSelectionModel ().addListSelectionListener ( listener );
table.getSelectionModel ().addListSelectionListener ( listener );
这就是你如何做到这一点的一个例子。
答案 1 :(得分:0)
谢谢大家。这就是我最终的结果:
ListSelectionListener listener = new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
// Only columns beyond the first are edited...
if (row != -1 && col > 0) {
table.editCellAt(row, col);
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_F2);
robot.keyRelease(KeyEvent.VK_F2);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}
};
为响应editCell()调用而创建的单元格编辑器在他们使用的JTextArea和JTextField上设置背景颜色。机器人的目的是模拟F2的压抑,从而揭示光标(错误的术语,我知道,但正确的一个逃脱了我)。
虽然出现阴影,但机器人在向前跳跃时工作,但不向后跳跃。我不知道在这种情况下是否执行了此代码片段,尽管单元格编辑器是以某种方式创建的。由于这个程序仅供我自己使用,我会在其他日子尝试解决这个小问题。