为什么在选择JButton后KeyListener不能工作?

时间:2019-10-25 18:45:04

标签: java swing jframe jpanel keylistener

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

我经常遇到一个错误,该错误不会注册KeyEvent,但是当我进行一些测试时,我发现如果我不删除panel#1并在该帧的顶部添加panel#2,只有在未选择面板#1上的JButton时(仅通过按“ TAB”),KeyListener才会注册。

有人可以帮助我删除此错误吗?

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

这是Main类:

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);
    }

1 个答案:

答案 0 :(得分:-1)

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

const solution = (values) => {
    values.sort( (a, b) => a-b ); // sort numerically, not lexically
    let smallest = 1; // default smallest positive integer
    values.some( value => 
        // ignore negative numbers
        // find the smallest integer not in the array
        value > 0 ? (value > smallest ? true : (smallest = value + 1) && false) : false
    );

    return smallest;
}

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

.setfocusable(false);