我试图以编程方式开始JTable
在按键上编辑当前行的第三列。
我实现了一个KeyListener,其中keyReleased()
包含以下代码
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);
myTab.editCellAt(myTab.getSelectedRow(), 2);
}
当我释放Enter时,单元格确实是可编辑的(我可以在末尾键入),但是没有插入符号。
当我用鼠标单击时,行为是预期的(我可以进行编辑,并且存在carret)。
另外,我注意到在释放键时,我的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");
}
}
});
我也对此myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);
电话表示怀疑。JavaDocs基本上说…
切换:true,扩展: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;
}
}
}
更新
在所有愚蠢,痛苦,难以找到的…
添加table.setSurrendersFocusOnKeystroke(true);
到您的代码…
设置当由于单元格的JTable转发键盘事件而激活编辑器时,此JTable中的编辑器是否获得键盘焦点。默认情况下,此属性为false,除非单击该单元格,否则JTable保留焦点。
我编写了一个自定义的,这样当我键入示例的列时,除了数字之外什么都不能输入。 如果用户单击单元格一次,然后开始键入,同时仍然允许用户双击单元格开始编辑,我如何防止用户能够编辑单元格?
问题内容: 我在项目中停留了2天,我无法实现如何使 ENTER KEY 像 TAB KEY一样工作 我尝试了 键侦听器, 但是ENTER KEY具有JTable的默认功能,因此它无法正常工作,而且它一直在下降。我在google上发现我需要使用 键绑定, 但是我无法实现它。 任何人都可以在JTable上给我完整的编码示例吗?请您帮忙。 提前致谢 问题答案: 基本的做法是使用键绑定API,该API在大
在我的程序中,有一个带有许多加速器的JMenu和一个可编辑的JTable。问题是,当编辑JTable时,加速器键仍然会被触发。 编辑上表中的任何单元格,有一个菜单项设置为哔哔声与加速器'n'。
设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JLi
问题内容: 我的目标是在编辑器上以VK-ENTER结尾的任何输入,它执行操作pindah(正在添加新行并设置光标在新行上闪烁)。抱歉,我无法从该示例中学习。 有办法吗? 这是我的代码(不包括导入,因为Eclipse会自动建议它): 问题答案: 不是答案,而是关于您代码的一些注释。 首先,您需要了解事件调度线程(EDT)。GUI组件的更新需要在EDT上完成。 通常,您不需要保留嵌套的SwingUti
我在我的JTable中实现撤消/重做功能,但是我在JTable的默认行为上有一个问题,它会在任何键按下时开始编辑单元格。 当按下这两个键时,如何防止单元格编辑? 注意:我有多个面板,其中一个面板内有多个表,我尝试重写,但失败了。