0

所以我正在制作一个游戏,我的主游戏应用程序运行良好。问题是,当我尝试通过菜单(例如使用按钮 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没有焦点。

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

调用这些setFocusable()方法是为了希望Button将焦点传递给Response框架中的组件。(在尝试找到解决方案几个小时后,我得出结论,不能专注于JFrames使用 a (尽管我没有看到它明确地写在任何地方,所以请随时纠正我)。BufferStrategy

知道发生了什么吗?

提前致谢。

4

1 回答 1

1

一般来说,在 java/swing 中,焦点似乎是一件相当棘手的事情。我经历过,即使在调用应该将焦点放在这些组件上的特定方法之后,组件也没有焦点。调用之后setFocusable(),如果出现setEnabled()在任何 Swing 组件上,您应该能够通过在应用程序运行后单击该组件来将焦点设置在该组件上,并且据我所知,这是可以实现的最好的并且保证可以工作。但是,永远不要依赖组件以您希望的方式传递焦点。这不太可能发生。

于 2018-01-14T14:38:31.383 回答