JFrame白色并且反应迟钝
我在编写一个名为“Coup”的游戏时遇到了麻烦,并且要解释什么是问题,我需要简单地解释一下游戏的内容。 Coup是一款纸牌游戏,玩家试图消除对方并成为最后一名玩家。要做到这一点,玩家可以选择一些行动,但他们也可以骗别的玩家。在这场比赛中,其他球员可以打电话“废话”或阻止其他球员的行动。正因为如此,我需要制作回应窗口,让其他玩家以挑战,*或无所作为回应。行动的结果取决于回应。例如,一名球员试图获得外援。我可以决定阻止他的行动或让他继续。如果我阻止,会有后果,但这不是问题。JFrame白色并且反应迟钝
真正的问题是这样的:我想给我的所有玩家有机会通过一个JFrame给予响应(块或者什么都不做),我使用while循环,等待所有玩家的响应。然而,这个while循环不会做任何事情,除非让方法继续前进,因为结果取决于玩家的反应。通过while循环,我构建的JFrame显示为白色,并且不包含我制作的两个按钮。在这一点上,我甚至可以按下关闭按钮,并且由于我所做的依赖于我的无响应窗口的while循环,它不会响应。有没有什么办法解决这一问题?
if (turnCount == players[currentPlayerNum].getPlayerNum()){
for(int i=0; i<players.length;i++){
//If it is not the players turn and they have one or two lives, make response window
if (players[i].getPlayerNum() != turnCount){
if (players[i].getLives() != 0){
//foreignAidBlock constructs the response window
players[i].foreignAidBlock(turnCount);
}
else{
//Not applicable since out of game/not in game
players[i].setResponse("NA");
}
}
else{
//Not applicable since out of game/not in game
players[i].setResponse("NA");
}
}
//Idea: PAUSE TILL RESPONSES COME IN
while(players[0].getResponse() != null || players[1].getResponse() != null || players[2].getResponse() != null || players[3].getResponse() != null)
{
System.out.println(players[0].getResponse());
System.out.println(players[1].getResponse());
System.out.println(players[2].getResponse());
System.out.println(players[3].getResponse());
}
结果我从运行这部分代码得到的是: “NA 空 NA NA ” 不断。我使用null来表示尚未回答的玩家。在该方法结束时,我将我所有的玩家能力都重置为空。
我的所有响应窗口都会将播放器的响应从null更改为“B”或“N”。但没有访问按钮,我不能这样做。除了使用while循环外,有没有人有关于如何使用某些东西来“暂停”我的线程的提示?
while
循环阻塞了您的UI线程。在不同的线程中执行while循环检查。
Thread t = new Thread(new Runnable(){...});
t.start();
这样你的用户界面不会被阻止,控件仍然会响应。
正如Abdul Fatir所说,这是因为UI线程被阻塞。
但是,我不会推荐直接搞乱线程。有一个SwingWorker类完全适用于这种情况,并建议你使用这个。
欲了解更多信息查看本博客文章 - Swing Worker Example
您也可以在下面的SO问题的一些有用的信息 - How do I use SwingWorker in Java
下面是来自官方的javadoc快速使用例如:
假设我们想找到“生命的意义”并将结果显示在JLabel中。
final JLabel label;
class MeaningOfLifeFinder extends SwingWorker<String, Object> {
@Override
public String doInBackground() {
return findTheMeaningOfLife();
}
@Override
protected void done() {
try {
label.setText(get());
} catch (Exception ignore) {
}
}
}
(new MeaningOfLifeFinder()).execute();
您可以强制JFrame保持打开并处于顶部,因此阻止其他操作继续。像一个JOptionPane也许 –
更改代码的结构。不要*循环*的条件:这阻止了用户界面,并且它不能做它自己的东西,如渲染。相反,使用事件*将*应答到更改状态,然后检查条件和“做下一个适当的事情” - “阻塞”是逻辑的,但与特定函数内的流程无关。 – user2864740