由于BufferStrategy而未生成KeyEvent

时间:2018-01-14 13:10:07

标签: java swing keyevent bufferstrategy

所以我正在制作游戏,而我的主要游戏应用程序运行良好。问题是,当我尝试通过菜单启动我的游戏时(例如使用按钮ActionEvent),我的游戏似乎无法检测给它的KeyEvents。 因此,我决定制作一个问题所在的代码的简单版本:

class Response
{
    static JFrame frame;
    static BufferStrategy strategy;
    public Response()
    {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.setIgnoreRepaint(true);
        frame.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e)
        {
            System.exit(0);
        }
        });
        frame.setVisible(true);
        frame.createBufferStrategy(2);
        strategy = frame.getBufferStrategy();

        frame.requestFocus();
    }
    public static void mainLoop()
    {
        while(true)
        strategy.show();
    }
}

class Button implements ActionListener
{
    JFrame f;
    JButton b;
    public Button()
    {
        f = new JFrame();
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b = new JButton("Click lol");
        b.setFocusable(false);
        b.addActionListener(this);
        f.add(b);
        f.setVisible(true);
        f.setFocusable(false);
    }

    public void actionPerformed(ActionEvent e)
    {
        f.dispose();
        new Response();
        Response.mainLoop();
    }

    public static void main(String args[])
    {
        new Button();
    }
}

点击此处的按钮后,我按预期得到一个空白屏幕,但它没有检测到KeyTyped事件,并且在检查时,Response.frame似乎没有焦点。

但是,如果我将main()的内容更改为 new Response(); Response.mainLoop();, 检测到KeyEvent。

setFocusable()方法已被调用,希望Button中的组件将焦点传递给Response帧。 (几个小时后试图找到解决方案,我得出结论,使用JFrames的{​​{1}}无法集中注意力(尽管我没有明确地将它写在任何地方,所以请随意纠正我。)

知道发生了什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

一般来说,焦点似乎是java / swing中的一个相当滑的东西。我经历过,即使在调用应该关注这些组件的特定方法之后,组件也没有焦点。在任何swing组件上调用setFocusable()和(如果存在setEnabled()之后),您应该能够通过在应用程序运行时单击该组件来设置焦点,并且我知道这是最好的一个人可以实现,并保证工作。但是,从不依赖于按照您希望的方式传递焦点的组件。这不太可能发生。