在下面的 Java 文件中,我创建了一个包含面板的框架,然后该面板嵌套了第二个面板。我正在尝试监听嵌套面板中的击键。我的方法是使用输入映射和动作映射。我发现如果我只有嵌套面板的输入映射,事情就会按预期工作。但是,如果父面板也有输入映射,则击键事件不会传递到嵌套面板。您可以通过注释和取消注释第一次调用 getInputMap().put 来观察此行为。有人有解决方案吗?
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class InputMapTest extends JPanel {
public InputMapTest() {
super(new BorderLayout());
JPanel panel = new JPanel();
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
getInputMap().put(ks, "someAction");
getActionMap().put("someAction", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("here1");
}
});
ks = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0);
panel.getInputMap().put(ks, "someOtherAction");
panel.getActionMap().put("someOtherAction", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("here2");
}
});
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.getContentPane().add(new InputMapTest());
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
请参阅 Oracle 教程如何使用按键绑定 http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html#maps
你错过了将焦点设置到 JPanelpanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(...) https://stackoverflow.com/a/7940227/714968
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)