有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从动作监听器中启动游戏

我有一个用Java制作的21点游戏,我想通过点击一个按钮来表示游戏的开始。我所有的动作监听器都工作得很好,但问题在于,如果没有完全在actionPerformed方法中运行,我就无法想出如何启动游戏。显然,在actionPerformed方法中持续运行的函数将有效地禁用我的GUI的其余部分。下面是一段代码片段

go.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
                 // START GAME SOMEHOW but must run outside of action listener
        }
    });

共 (2) 个答案

  1. # 1 楼答案

    Obviously, a function continuously running within the actionPerformed method will effectively disable the rest of my GUI.

    这是一个有效的观察结果,表明您已经理解了使用Swing时的基本规则

    你的游戏很可能是事件驱动的(如果我错了,请纠正我),因此按钮执行的操作应该只是将程序设置为新状态,等待进一步的事件。这并不需要花费时间,通常由EDT直接完成

    当然,如果你想制作一个奇特的新游戏动画,需要在一个单独的线程中执行,在这种情况下,你只需从actionPerformed方法中启动动画线程(我建议使用SwingWorker),然后返回

    在代码中,我想象它是这样的:

    go.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
    
            // Remove the menu components
            someJPanel.removeAll();
    
            // Show the game table
            someJPanel.add(new GamePanel());
    
            someJPanel.revalidate();
            someJPanel.repaint();
    
            // done. Wait for further user actions.
        }
    });
    
  2. # 2 楼答案

    我相信你想要扩展javax.swing.SwingWorker

    非ui启动功能将在doInBackground中运行,done方法将在更新ui完成时被调用

    javadoc类描述中甚至有一个例子,可以用启动中发生的事情的状态更新progressbar