2012-12-08 109 views
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++; 
} 

} 

它工作得很好。但是当我有一个我想使用的GUI而不是JOptionPane时,它全部崩溃。 GUI具有包含JLabel文本,对于列表选项JComboBoxJButton以确认JPanel。我想要做的是让程序“暂停”,并等待用户点击该按钮,然后将所选项目放入select并继续。

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

此外,它可能不会从上述显而易见的,但我做了该计划的过程中不同的方法,这大约二三十倍,所以我真的需要一个通用的解决方案,而不是一蹴而就的事情。

我认为这样做与多个线程可能工作,但我似乎无法得到正确的(主线程停止执行得太早 - 该按钮甚至没有显示出被点击),无论如何, d更喜欢简单的东西。

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

任何想法?

+0

我想的JOptionPane块UI,因为它的模态对话框,如果你需要你的布局是模式 - 试试这个http://stackoverflow.com/questions/1481405/how-to-make-a-jframe-modal-in-摆动爪哇。您也可以使用多线程模型 - 您只需创建新线程,调用join()并等待用户输入。 –

回答

0

多线程方法可能仍然是最简单的方法。如果实际上在对话出现时并不需要程序逻辑继续前进,并且不介意需要额外的线程以提高零速度,那么可以在实际的游戏逻辑类waitforinput()中添加一个函数,只需在GUI线程中调用某个东西后即可投入。使它看起来是这样的:

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

    } 
    gotInput=false; 
    return; 
} 

然后让你的GUI类翻转输入变量每当完成一件应该恢复比赛。它不漂亮,但它很简单,应该适合你的目的。

+1

繁忙循环不好。你应该使用一个同步的'wait()'/'notify()'对。 –

+0

显然,有更好的方法来做到这一点,但他似乎无法找到它们。这可能是最简单的,看到这款游戏可能没有任何性能要求,它似乎可以完成这项工作。 – NathanTempelman