KeyListener在JFrame中随机运行

时间:2018-10-08 16:08:06

标签: java swing jframe jpanel keylistener

每次我运行我的应用程序时, 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并实现了KeyListenerActionListenerMouseInputListener

tm是Timer对象

screenSize是Dimension对象

1 个答案:

答案 0 :(得分:1)

在使框架可通过之前,应将组件添加到框架。

如果尚未将组件添加到框架中,并且KeyListener仅在具有焦点的组件上起作用,则不能为组件提供焦点。

通常会出现随机结果,因为您没有在Event Dispatch Thread (EDT)上创建GUI。所有Swing组件和对Swing组件的更新都应在EDT上完成。阅读Concurrency上的部分,以获取更多信息和创建GUI的正确方法示例。

此外,您不应使用KeyListener来监听事件。如您所见,它们不可靠,因为它们取决于具有焦点的组件。相反,您应该使用Key Bindings。即使组件没有焦点,也可以将它们配置为工作。