1
我有JButton通过ActionListener执行某些操作。在我尝试使用动作绑定键盘快捷键(在this之后)后,鼠标点击按钮可以工作,但对键盘没有反应。键绑定不起作用
代码之前
在面板中创建的按钮,添加了actionListener。
private FooActionListener actionListener = new FooActionListener();
buttonLeft = new JButton("Left");
up.addActionListener(actionListener);
然后,主类外FooActionListener类中的actionPerformed方法:
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == buttonLeft) { thing.move(Direction.LEFT); }
}
代码后
final String leftText = "Left";
final Action left = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
thing.move(Direction.LEFT);
}
};
buttonLeft = new JButton(left);
buttonLeft.setText(leftText);
KeyStroke keyLeft = KeyStroke.getKeyStroke(KeyEvent.VK_A, 0);
buttonLeft.getInputMap(buttonLeft.WHEN_IN_FOCUSED_WINDOW).put(keyLeft,
"Left");
buttonLeft.getActionMap().put("Left", left);
更新:我不太清楚新的代码实际上执行它应该是鼠标。假设对象应该通过一次点击来移动25个像素,并且它在原始代码中执行。但是随着新动作的出现,它似乎会在每次点击时移动两次甚至三次,这表明动作有些奇怪的行为。
请您详细说明吸收映射的含义是什么?此外,检查问题的更新,看看是否提示任何事情。这个EventQueue.invokeLater业务是关于什么的? – theUg
按钮实现可能“吸收”了关键事件,这可能是其对助记符支持的一部分,可能会阻止它为关键绑定引发事件。我可以考虑这样一个重复事件的唯一原因是,你正在关键。 'EventQueue.invokeLater'是因为Swing是一个单线程API,所有对UI的更新都必须在Event Dispatching Thread中进行。当你执行'main'时,确保你没有使用EDT – MadProgrammer
至于重复,我在这里谈论鼠标点击。我使用与原始代码完全相同的鼠标点击,但它似乎像它在相同的点击两次调用thing.move方法。有没有一种方法来调试它? – theUg