目前我正在尝试编写基于网格的游戏。 香港专业教育学院已经设法实现了一般导航的关键监听器。 但是当按某个键时,会打开一个Jpopup菜单。
现在我想实现菜单导航以及关键监听器。按B应该再次关闭菜单。
KeyListener UnitActionMenuKeyListener = new KeyListener() {
@Override
public void keyPressed(KeyEvent evt)
{
if (evt.getKeyCode()==KeyEvent.VK_B)
menu.setVisible(false)
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
JPopupMenu menu = new JPopupMenu("UnitActionMenu");
JMenuItem bewegenItem = menu.add("test");
在此之后使用menu.show和menu.addKeyListener。
但无论我尝试什么,我的一般导航都不会再工作了,或者一般导航都能正常工作,但我的菜单不会对按下B做出反应
那么,我如何为多个元素实现多个关键监听器? 我只是希望我的主窗口能够以不同于我的菜单
的方式收听(和反应)某些键(抱歉写得不好,我的英语不是很好,而且因为一个简单的任务超过4个小时而感到沮丧)
答案 0 :(得分:1)
Swing键绑定通常比键侦听器更好。关键听众有与焦点系统相关的问题。这就是你所遇到的问题。当弹出窗口处于活动状态时,它会窃取焦点。只有焦点组件才会发出关键事件。
这里有关键绑定的教程:https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
API有点复杂,但它们更强大,您可以直接指定焦点行为。
这是一个将关键侦听器转换为键绑定的快速指南。
对于一个关键的监听器,你有一些代码是这样的:
myComponent.addKeyListener(new KeyListener() {
...
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_Z)
performZAction();
}
});
编写一个键绑定就像这样:
KeyStroke keystroke =
KeyStroke.getKeyStroke("typed Z");
myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(keystroke, "zAction");
myComponent.getActionMap()
.put("zAction", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
performZAction();
}
});
换句话说,有三个步骤:
KeyStroke.getKeyStroke
创建javax.swing.KeyStroke
对象。javax.swing.Action
。 Action
是你的倾听者。您可以扩展javax.swing.AbstractAction
,就像撰写ActionListener
一样。