每次我运行我的应用程序时, 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);
}
类 ThreeDimChessRunner 扩展了JPanel
并实现了KeyListener
,ActionListener
和MouseInputListener
。
tm是Timer
对象
screenSize是Dimension
对象
答案 0 :(得分:1)
在使框架可通过之前,应将组件添加到框架。
如果尚未将组件添加到框架中,并且KeyListener仅在具有焦点的组件上起作用,则不能为组件提供焦点。
通常会出现随机结果,因为您没有在Event Dispatch Thread (EDT)
上创建GUI。所有Swing组件和对Swing组件的更新都应在EDT
上完成。阅读Concurrency上的部分,以获取更多信息和创建GUI的正确方法示例。
此外,您不应使用KeyListener来监听事件。如您所见,它们不可靠,因为它们取决于具有焦点的组件。相反,您应该使用Key Bindings。即使组件没有焦点,也可以将它们配置为工作。