Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从动作监听器中启动游戏_Java_Swing_Event Handling_Actionlistener - Fatal编程技术网

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

Java 从动作监听器中启动游戏,java,swing,event-handling,actionlistener,Java,Swing,Event Handling,Actionlistener,我有一个用Java制作的21点游戏,我想通过点击一个按钮来表示游戏的开始。我所有的动作监听器都工作得很好,但问题在于,如果没有完全在actionPerformed方法中运行,我就不知道如何启动游戏。显然,在actionPerformed方法中连续运行的函数将有效地禁用GUI的其余部分。下面是一段代码片段 go.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e

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

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

您的游戏可能应该从自己的线程开始,并自行管理(很难说),但为了让您继续,您可以从一个新的“外部”线程开始游戏,类似于您的actionPerformed中的以下内容:

public void actionPerformed(ActionEvent e) {
    Thread thread = new Thread("Game thread") {
        public void run() {
            startGame(); //or however you start your game
        }
    };
    thread.start();
}
显然,在actionPerformed方法中连续运行的函数将有效地禁用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.
    }
});

我相信你想要延长

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


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

游戏启动时做什么?它不应该有一个循环。所有的用户行为都应该是事件。我认为一个好的解决方案可能是不启动整个游戏,而只是发牌并返回。但是,我想知道如何从动作侦听器中启动程序。我想这是可能的,但我对Java和所有这些计算机都是新手。任何提示都将不胜感激!!!:)谢谢你的重播,JB。最初,我让它初始化一个新游戏,在它的构造函数中运行整个过程,因此actionPerformed方法只是有一句话:“game g=new game()”然而,现在你提到它应该只是一个事件,我更确信我做得不对。哈哈,我觉得这绝对是我应该做的。我要实现这个,看看它能把我带到哪里。我很惊讶这么快就得到这么多的回复。我真的很感谢大家的帮助!!!除非这是一个“每秒帧数”驱动/连续动画的应用程序,否则我认为启动一个单独的线程来运行游戏似乎是个坏主意。actionPerfomed应该只是调整用户界面,返回,然后等待进一步的用户操作。这就是我假设的,因为游戏运行没有返回,对我来说听起来不是很受事件驱动。