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