JFrame中的JPanel即使在聚焦时也不会听到键

时间:2013-07-24 22:28:30

标签: java swing jpanel keylistener

我有一个名为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();
}

2 个答案:

答案 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无法集中注意力。而是使用键绑定。