Java Swing JTable-在Shift键上使用键绑定而不是KeyListener
很抱歉,如果之前已经回答了这个问题,我试图寻找解决方案,但找不到任何相关的解决方案。我是新来的,所以有一个机会,我完全忽略了或忽略了一些东西,这会导致我找到一个简单的解决方案Java Swing JTable-在Shift键上使用键绑定而不是KeyListener,java,swing,jtable,keylistener,key-bindings,Java,Swing,Jtable,Keylistener,Key Bindings,很抱歉,如果之前已经回答了这个问题,我试图寻找解决方案,但找不到任何相关的解决方案。我是新来的,所以有一个机会,我完全忽略了或忽略了一些东西,这会导致我找到一个简单的解决方案 我已经为shift键实现了一个键侦听器,因此当用户按下shift键时,他会在进入编辑窗口前恰好一行输入单元格。请查看下面的代码。虽然,有一个问题;如果用户当前正在单元格中输入数据,则shift键不起作用,并且在调试时,我们可以看到程序甚至从未进入按键侦听器。我被告知使用密钥绑定而不是密钥侦听器来解决此问题。我试着在网上学习
我已经为shift键实现了一个键侦听器,因此当用户按下shift键时,他会在进入编辑窗口前恰好一行输入单元格。请查看下面的代码。虽然,有一个问题;如果用户当前正在单元格中输入数据,则shift键不起作用,并且在调试时,我们可以看到程序甚至从未进入按键侦听器。我被告知使用密钥绑定而不是密钥侦听器来解决此问题。我试着在网上学习一些教程,但似乎失败了。任何帮助都将不胜感激,非常感谢 “双键侦听器”选项卡可以正常工作,而Shift不能:
table.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
//KeyCode 9 is a key code for the Tab key
if (e.getKeyCode() == 9) {
if(table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())) {
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn());
} else {
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn() + 1);
}
}
//The problem occurs here
//KeyCode 16 is a key code for the Shift key
if (e.getKeyCode() == 16) {
if(table.isCellEditable(table.getSelectedRow() + 1, table.getSelectedColumn())) {
table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn());
table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn());
table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
} else {
table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn() + 1);
table.setColumnSelectionInterval(table.getSelectedColumn() + 1, table.getSelectedColumn() + 1);
table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
}
}
}
});
以下是我尝试过但失败的解决方案:
class ShiftAction extends AbstractAction{
public void actionPerformed(ActionEvent ae){
System.out.println("Shift");
table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn());
table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn());
table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1);
}
}
shiftAction = new ShiftAction();
table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,KeyEvent.SHIFT_DOWN_MASK),"doShiftAction");
table.getActionMap().put("doShiftAction",shiftAction);
希望这个问题不是太愚蠢,再一次,提前谢谢你
e.getKeyCode() == 9
首先,不要使用幻数。阅读代码的人不知道9是什么意思。使用KeyEventAPI中提供的字段:KeyEvent.VK_
我们可以看到,该程序甚至从未进入密钥侦听器
焦点是用作单元格编辑器的JTextField,因此它接收KeyEvent,而不是表
我被告知使用密钥绑定而不是密钥侦听器来解决此问题 您需要使用适当的InputMap。在这种情况下,应为:
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
有关更多信息,请阅读Swing教程中的部分。我很抱歉,我希望我已经仔细考虑过了。Tab键的键代码为9,Shift键的键代码为16。我将立即在中编辑信息。我将尝试将所有这些应用于代码。我想知道,在这种情况下,合适的JComponent是JTable还是JTextField?我被告知使用键绑定而不是键侦听器来解决这个问题。:由谁??去问问他们。这不会解决您的问题,但会增加您的问题,正如您现在正确看到的,我的Java讲师已经告诉我这样做,他没有那么多时间来帮助我,我还有几天的时间完成项目。这没什么大不了的,我可以保持原样,这对我来说更像是一次学习经历。@gpasch,是的,键绑定是更好的解决方案。它是一个更新更好的API,解决了焦点问题。