当在JTable
(称为gametable
)中按下 enter 时,此代码调用例程。它效果很好,但我希望在Action
中向上或向下移动时调用相同的JTable
,而不需要按 enter ;我无法让它发挥作用。我尝试用VK_ENTER
代替VK_UP
,但我无法在桌面上下移动?
KeyStroke enter = KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0);
gameTable.getJTable().unregisterKeyboardAction(enter);
gameTable.getJTable().registerKeyboardAction(new ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
synchronized (this) {
gotoGame(gameTable.getSelectedIndex());
}
}
}, enter, JComponent.WHEN_FOCUSED);
我无法理解。有人能帮助我吗?
答案 0 :(得分:3)
您必须将步骤分开:
首先在KeyStroke
中放置两个InputMap
个实例,以便它们定位相同的actionMapKey
:
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
String actionMapKey = "anActionMapKey";
gameTable.getInputMap().put(enter, actionMapKey);
gameTable.getInputMap().put(up, actionMapKey);
然后将actionMapKey
与您的Action
:
gameTable.getActionMap().put(actionMapKey, new AbstractAction(actionMapKey) {
...
});
有关详细信息,请参阅How to Use Actions和Key Bindings。
我对你在这种情况下使用synchronized (this)
持谨慎态度;你应该在event dispatch thread上构建你的GUI。
答案 1 :(得分:0)
您需要为JTable添加一个keylistener。然后在您的键监听器中,您可以检查是否按下任何按钮,包括Enter并执行相同的操作。
我有一个类似代码的程序。如果箭头键选择不同的单元格,我只在一个textarea中显示不同的值,但我认为它可以让你知道如何设置它。
import java.awt.event.KeyEvent;
import javax.swing.JTable;
public class MyClass {
static JTable table = new JTable();
public static void main(String[] args) {
table.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(final java.awt.event.KeyEvent evt) {
tableKeyReleased(evt);
}
});
}
private static void tableKeyReleased(final java.awt.event.KeyEvent evt) {
final int key = evt.getKeyCode();
if (key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN
|| key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT) {
final int row = table.getSelectedRow();
final int column = table.getSelectedColumn();
final Object cellValue = table.getValueAt(row, column);
if (cellValue == null) {
return;
}
}
}
}