Почему KeyListeners не работает, когда выбран JButton? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь удалить из определенного фрейма панель № 1 (которая содержит только один JButton) и добавить к ней панель № 2, которая содержит некоторые ключевые события.

Я постоянно получал ошибку, когдаKeyEvents не будет регистрироваться, но пока я тестировал некоторые вещи, я обнаружил, что если я не уберу панель № 1 и не добавлю панель № 2 поверх фрейма, KeyListeners будет регистрироваться, только если JButton напанель № 1 не выбрана (только нажатием клавиши «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);
    }

1 Ответ

0 голосов
/ 25 октября 2019

Мне удалось это исправить, спасибо всем: один из способов исправить это - сделать JButton не сфокусированным, используя:

.setfocusable(false);

Таким образом, JButton не будет сфокусирован и помечен, ноТем не менее, при входе в Panel # 2 вам нужно будет нажать «TAB», чтобы снова сосредоточиться на новой Panel, и для этого может пригодиться java.awt.Robot:

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