3

好的,所以我在这里看到了很多这样的问题,但是提供的答案似乎都不适用于我的特殊情况。

我有一个分两部分编写的游戏模拟程序;我首先编写了实际的功能,然后是 GUI 来显示它。我想当我完成后,我只需执行来回调用以使两者相互交谈。后端同时使用 JOptionPane 来获取用户输入。

我的问题是,现在我想在 GUI 中显示东西,我不知道如何暂停程序的运行以等待它发生。例如,我在原始版本中有这个:

private static void runAttackerTurn(Team off, Team def) {

int counter = 0;
while (counter < 4 && off.whoHasIt() != null) {
    //Do some stuff
    active = getActive(off, def, counter);
    select = (String)JOptionPane.showInputDialog(null, 
                    "Who Would " + active.getName() + " Like To Attack?" + "\n" +
                    off.whoHasIt().getName() + " has the ball",
                    "Turn " + turnCount + " - " + teamName + " Attacker Turn" ,
                    JOptionPane.INFORMATION_MESSAGE, null,
                    attackerOptions, attackerOptions[0]);
    target = getTarget(off, def, select, counter);
    attack((Forward)active, target);    
    //More stuff
    counter++;
}

}

它工作得很好。但是,当我有一个我想使用而不是 JOptionPane 的 GUI 时,一切都会崩溃。GUI 有一个JPanel包含一个JLabel用于文本、一个JComboBox用于列表选项和一个JButton用于确认。我想做的是让程序有效地“暂停”,然后等待用户点击按钮,然后选择所选项目,将其放入select并继续。

我不能像我最初尝试的那样将该方法分成两部分,因为除了将结果发送select到第二部分之外,我还需要发送其他东西。

另外,从上面可能看不出来,但我在程序过程中用不同的方法做了大约 20 到 30 次,所以我真的需要一个通用的解决方案而不是快速修复。

我认为使用多个线程执行此操作可能会起作用,但我似乎无法做到这一点(主线程过早停止执行 - 按钮甚至没有显示为被点击),无论如何,我更喜欢更简单的东西.

此外,如果这不是很清楚,我真正想做的是在嵌入在 GUI 中的 JPanel 中模拟 JOptionPane 的 modal 属性,并使该方法在继续之前等待用户输入。

有任何想法吗?

4

1 回答 1

0

多线程方法可能仍然是最简单的方法。如果您实际上不需要程序逻辑在对话框出现时继续运行,并且不介意需要一个零速度增加的额外线程,您可以在您的实际游戏逻辑类中使用一个名为 waitforinput() 的函数只是在你在 GUI 线程上调用一些东西之后你就扔进去了。让它看起来像这样:

waitForInput()
{
   while(gotInput==false)
   {

   }
   gotInput=false;
   return;
}

然后让您的 GUI 类在完成应该恢复游戏的操作时翻转输入变量。它不漂亮,但它很简单,应该可以很好地满足您的目的。

于 2013-04-17T18:48:04.377 回答