由于 BufferStrategy 而未生成 KeyEvent
KeyEvent not getting generated due to 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
框架。
(经过几个小时试图找到解决方案,我得出结论,使用 BufferStrategy
的 JFrames
不能被关注(虽然我没有看到它明确地写在任何地方,所以请随时纠正我).
知道发生了什么吗?
提前致谢。
总的来说,焦点在java/swing中似乎是一件很滑的事情。我曾经历过,即使在调用了应该将焦点放在这些组件上的特定方法之后,组件也没有焦点。在调用 setFocusable()
之后,如果在任何 swing 组件上存在 setEnabled()
,一旦应用程序 运行 并且据我所知,您应该能够通过单击该组件来设置焦点这是可以实现的最好的,并且可以保证工作。但是,永远不要依赖组件以您喜欢的方式传递焦点。这不太可能发生。
所以我正在制作游戏,我的主要游戏应用程序 运行 没问题。问题是,当我尝试通过菜单启动我的游戏时(例如,使用按钮 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
框架。
(经过几个小时试图找到解决方案,我得出结论,使用 BufferStrategy
的 JFrames
不能被关注(虽然我没有看到它明确地写在任何地方,所以请随时纠正我).
知道发生了什么吗?
提前致谢。
总的来说,焦点在java/swing中似乎是一件很滑的事情。我曾经历过,即使在调用了应该将焦点放在这些组件上的特定方法之后,组件也没有焦点。在调用 setFocusable()
之后,如果在任何 swing 组件上存在 setEnabled()
,一旦应用程序 运行 并且据我所知,您应该能够通过单击该组件来设置焦点这是可以实现的最好的,并且可以保证工作。但是,永远不要依赖组件以您喜欢的方式传递焦点。这不太可能发生。