我有一个名为gameFrame的JFrame,我添加了一个名为introPanel的Jpanel,gameFrame.add(introPanel)
,我想用一个keylistener来听JPanel,所以我添加了一个。当用户按Enter键时,我从gameFrame中删除了JPanel,并在理论上添加了MainMenu,但是程序没有听我的键。所以我在网上搜索了SO,发现我必须让小组专注,所以我做了:
public IntroMenuStart() {
this.addKeyListener(this);
this.setFocusable(true);
this.requestFocusInWindow();
}
然而,这也不起作用。我还能做些什么来解决这个问题?
每个Panel都是一个单独的类,它们都会从游戏框中删除,并添加下一个面板。
我更喜欢用keylistener来做这件事。
修改
我通过在我的代码中包含这个来修复它,对于任何想要知道的人,但我将把我的代码更改为Keybindings,就像2个答案一样。
public void addNotify() {
super.addNotify();
requestFocus();
}
答案 0 :(得分:3)
我想使用键监听器列表到面板,所以我添加一个。什么时候 用户按Enter键,我删除到JPanel形式的gameFrame并添加 MainMenu,理论上,程序不会听我的密钥
如果你深入搜索SO,你会发现你必须使用KeyBindings KeyListener有两个问题,你听所有的键,你必须有焦点。 而是键绑定键,而不必成为焦点。
简单示例:
AbstractAction escapeAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
//code here example
((JComponent)e.getSource()).setVisible(Boolean.FALSE);
}};
String key = "ESCAPE";
KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key);
component.getActionMap().put(key, escapeAction);
您可以使用这些JComponent常量
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
WHEN_FOCUSED
WHEN_IN_FOCUSED_WINDOW
答案 1 :(得分:2)
我认为JPanel
无法集中注意力。而是使用键绑定。