KeyListener 在 JFrame 中随机工作
KeyListener Works at Random in JFrame
每次我 运行 我的应用程序时,KeyListener 是否正常工作都是掷硬币。如果它能工作,以后任何时候都不会有任何问题,但如果它在应用程序启动时没有工作,它永远不会 运行 直到程序关闭并重新启动。
public ThreeDimChessRunner() {
record = new ArrayList<Integer>();
winner = Player.NONE;
game = new ThreeDimBoard(0);
addMouseListener(this);
addKeyListener(this);
setFocusable(true);
tm.start();
screenWidth = screenSize.width;
screenHeight = screenSize.height;
}
public static void main(String[] args){
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
ThreeDimChessRunner p = new ThreeDimChessRunner();
JFrame frame = new JFrame("3D Chess");
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(p);
}
classThreeDimChessRunner 扩展了 JPanel
并实现了 KeyListener
、ActionListener
和 MouseInputListener
。
tm 是一个 Timer
对象
screenSize 是一个 Dimension
对象
在框架可行之前,应将组件添加到框架中。
如果组件尚未添加到框架并且 KeyListener 仅适用于具有焦点的组件,则无法将焦点赋予该组件。
随机结果通常是因为您没有在 Event Dispatch Thread (EDT)
上创建 GUI。所有 Swing 组件和 Swing 组件的更新都应该在 EDT
上完成。阅读有关 Concurrency 的部分,了解更多信息和创建 GUI 的正确方法示例。
此外,您不应使用 KeyListener 来侦听事件。正如您所注意到的,它们不可靠,因为它们依赖于具有焦点的组件。相反,您应该使用 Key Bindings。即使组件没有焦点,它们也可以配置为工作。
每次我 运行 我的应用程序时,KeyListener 是否正常工作都是掷硬币。如果它能工作,以后任何时候都不会有任何问题,但如果它在应用程序启动时没有工作,它永远不会 运行 直到程序关闭并重新启动。
public ThreeDimChessRunner() {
record = new ArrayList<Integer>();
winner = Player.NONE;
game = new ThreeDimBoard(0);
addMouseListener(this);
addKeyListener(this);
setFocusable(true);
tm.start();
screenWidth = screenSize.width;
screenHeight = screenSize.height;
}
public static void main(String[] args){
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
ThreeDimChessRunner p = new ThreeDimChessRunner();
JFrame frame = new JFrame("3D Chess");
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(p);
}
classThreeDimChessRunner 扩展了 JPanel
并实现了 KeyListener
、ActionListener
和 MouseInputListener
。
tm 是一个 Timer
对象
screenSize 是一个 Dimension
对象
在框架可行之前,应将组件添加到框架中。
如果组件尚未添加到框架并且 KeyListener 仅适用于具有焦点的组件,则无法将焦点赋予该组件。
随机结果通常是因为您没有在 Event Dispatch Thread (EDT)
上创建 GUI。所有 Swing 组件和 Swing 组件的更新都应该在 EDT
上完成。阅读有关 Concurrency 的部分,了解更多信息和创建 GUI 的正确方法示例。
此外,您不应使用 KeyListener 来侦听事件。正如您所注意到的,它们不可靠,因为它们依赖于具有焦点的组件。相反,您应该使用 Key Bindings。即使组件没有焦点,它们也可以配置为工作。