【问题标题】:Why won't KeyListeners work when a JButton is selected?为什么选择 JButton 时 KeyListener 不起作用?
【发布时间】:2020-02-22 03:15:08
【问题描述】:

我正在尝试从特定框架 panel#1(仅包含一个 JButton)中删除并添加到其中包含一些 KeyEvents 的 panel#2。

我经常遇到 KeyEvent 无法注册的错误,但是当我测试一些东西时,我发现如果我不删除面板#1 并在框架顶部添加面板#2,仅当未选择面板#1 上的 JButton(仅通过按“TAB”)时,KeyListeners 才会注册。

有人可以帮我删除这个错误吗?

这是面板#2:

public class paintTest  extends JPanel implements KeyListener
{
    public paintTest(){
        addKeyListener(this);
        setFocusable(true);
    }
    @Override
    public void keyPressed(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}

    @Override
    public void keyTyped(KeyEvent e) {}
}

这是主类:

public static void main(String[] args) 
    {
        JFrame mainMenu = new JFrame();
        drawMainMenu(mainMenu);

        mainMenu.setVisible(true);
        mainMenu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    public static void drawMainMenu(JFrame frame)
    {
        frame.setBounds(0, 0, 360, 300);

        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        frame.add(panel);

        JButton newGame = new JButton();
        newGame.setBounds(130, 120, 100, 30);
        newGame.setText("NEW GAME");    

        newGame.addMouseListener(new MouseAdapter() 
        {
            public void mouseClicked(MouseEvent arg0) 
            {
                paintTest gamePlay = new paintTest();

//              frame.remove(panel);  **HERE IS THE LINE OF CODE I WANT TO REMOVE**

                frame.add(gamePlay);

                frame.setBounds(0,0,512,512);

                frame.setLocationRelativeTo(null);

            }
        });
        panel.setLayout(null);
        panel.add(newGame);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

【问题讨论】:

  • 我知道你建议我使用 KeyBinding,但我想问为什么会这样
  • 是的,这是最好的解决方案,但这不是我要说的。我多次说明未生成关键事件的原因并为您提供了解决方案。阅读 cmets。我不应该重复自己 2 或 3 次。

标签: java swing jframe jpanel keylistener


【解决方案1】:

我已经解决了,谢谢大家: 解决此问题的一种方法是使用以下方法使 JButton 不可聚焦:

.setfocusable(false);

这样,JButton 将不会被聚焦和标记,但是,当进入 Panel#2 时,您仍需要按“TAB”以再次聚焦新面板,并且可以使用 java.awt.Robot :

try {
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
} catch (AWTException e) {
    e.printStackTrace();
}

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2011-06-26
    • 2017-09-06
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多