KeyListener直到Java中的最小化和最大化窗口才起作用

问题描述 投票:0回答:1

我尝试创建一个基本的Snake游戏。首先,将开始屏幕显示为JPanel,并且当用户单击“开始”按钮时,该面板将对“ .setVisible(false)”不可见,并且gameScreen(也是JPanel)也将可见。但是在我最小化和最大化窗口之前,在GameScreen类中使用的KeyListener无效。我认为我对第一个clase设置有问题。

JFrame window = new JFrame("Snake");
    window.setUndecorated(true);
    window.setLayout(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setResizable(false);
    window.setBounds(0, 0, 720, 480);
    StartScreen startScreen = new StartScreen(frameWidth, frameHeight);
    startScreen.setBounds(0, 0, frameWidth, frameHeight);
    startScreen.setVisible(true);

    window.add(startScreen);
    window.setVisible(true);

    while(startScreen.isVisible()){// I know it's bad way but I don't know the better one
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            Logger.getLogger(Core.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    Game gameScreen = new Game(frameWidth, frameHeight, startScreen.getIsClassic());
    gameScreen.setBounds(0, 0, frameWidth, frameHeight);
    window.add(gameScreen);
    gameScreen.setVisible(true);
    window.setVisible(true);

是从我的主类创建的,我创建了JFrame并向其中添加了JPanels。

public Game(int weight, int height, boolean isClassic) {
    super();
    this.setLayout(null);
    this.setFocusable(true);
    // some other thing about game

    this.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("Yo ho!");
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    });
}

这是扩展JPanel的Game类的构造函数。

我有什么问题?

java swing jframe jpanel keylistener
1个回答
0
投票

无法做您想做的事情,因为KeyEvent之类的事件仅在它们具有焦点时才传递给组件。您应该对OS进行控制,以捕获非焦点窗口的事件,但是出于安全原因,Java禁止这样做。此外,每个操作系统对事件的处理方式都不同于其他操作系统,因此很难统一VM的行为。有些人可以尝试做一些技巧,但是每种解决方法都可能导致行为异常。

© www.soinside.com 2019 - 2024. All rights reserved.