我试图以编程方式开始编辑JTable按键上的当前行的第三列.
我已经实现了一个keyReleased()包含此代码的KeyListener
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);
myTab.editCellAt(myTab.getSelectedRow(), 2);
}
Run Code Online (Sandbox Code Playgroud)
当我释放回车时,单元格确实可以编辑(我可以在最后键入),但没有插入符号.
当我用鼠标点击时,行为是预期的(我可以编辑和carret存在).
另外,我注意到在keyrelease上,我的celleditor是null,并且在mouseclick上它不是null.
我究竟做错了什么?
避免KeyListener,当涉及到焦点和调度事件的顺序时,它是不可靠的(在听众之前可以让他们锁定密钥,因此永远不会得到通知).
使用键绑定,而不是
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = table.getActionMap();
KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
im.put(enterKey, "Action.enter");
am.put("Action.enter", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
table.changeSelection(table.getSelectedRow(), 2, false, false);
if (!table.editCellAt(table.getSelectedRow(), 2)) {
JOptionPane.showMessageDialog(table, "Failed to start cell editing");
}
}
});
Run Code Online (Sandbox Code Playgroud)
我也怀疑这个myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);电话.JavaDocs基本上说......
toggle:true,extend:false.如果选择了指定的单元格,请取消选择它.如果未选中,请选择它.
这对我来说,如果当前选择了单元格,它将被取消选中.
更新了工作示例
public class TestTableEditor {
public static void main(String[] args) {
new TestTableEditor();
}
private JTable table;
public TestTableEditor() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
table = new JTable(new MyTableModel());
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = table.getActionMap();
KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
im.put(enterKey, "Action.enter");
am.put("Action.enter", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
table.changeSelection(table.getSelectedRow(), 1, false, false);
if (!table.editCellAt(table.getSelectedRow(), 1)) {
JOptionPane.showMessageDialog(table, "Failed to start cell editing");
}
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MyTableModel extends AbstractTableModel {
@Override
public int getRowCount() {
return 1;
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
switch (columnIndex) {
case 0:
value = "Can't edit";
break;
case 1:
value = "Edit me";
break;
case 2:
value = "Can't edit";
break;
}
return value;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新
在所有愚蠢,痛苦,难以找到...
添加table.setSurrendersFocusOnKeystroke(true);到您的代码......
设置当由于JTable转发单元的键盘事件而激活编辑器时,此JTable中的编辑器是否获得键盘焦点.默认情况下,此属性为false,并且除非单击单元格,否则JTable将保留焦点.