首页 > 解决方案 > 为什么选择 JButton 时 KeyListener 不起作用?

问题描述

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

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

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

这是面板#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);
    }

标签: javaswingjframejpanelkeylistener

解决方案


我设法修复它,谢谢大家:解决这个问题的一种方法是使用以下方法使 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();
}

推荐阅读