0
我正在用Java開發一款遊戲。 在服務器端,在發送信息給客戶端之前,我更改了gui。 當我運行它沒有網絡部分(代碼中的標籤1),它運行良好。但是當我做網絡部分(注意它是在gui部分之後完成的,並且我編碼了5秒的睡眠線程部分) ,gui掛起。Java GUI在聯網之前被掛起
這裏是我們的一小段程式碼:你睡覺的時候
public void startgame()
{
Main.setx=Start.setx;
Main.sety=Start.sety;
gui1 = new Main(); // Bind it
gui1.setOpaque(true);
container.add(gui1);
container.remove(hostpanel);
container.setSize(Start.setx,Start.sety);
container.setPreferredSize(new Dimension(Start.setx,Start.sety));
container.setVisible(true);
container.repaint();
gui=(Main)gui1; // 1
try {
System.out.println("Thread sleeping");
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread awake");
if(vector.get(0)!=null)
{
pl1=new Human_player(vector.get(0));
pl1.send(1);
}
else
{
}
if(vector.get(1)!=null)
{
pl2=new Human_player(vector.get(1));
pl2.send(2);
}
else
{
}
if(vector.get(2)!=null)
{
pl3=new Human_player(vector.get(2));
pl3.send(3);
}
else
{
}
ArrayList<Integer> cards=new ArrayList<Integer>();
int i;
for(i=0;i<=51;i++)
{
cards.add(i,i);
}
Collections.shuffle(cards);
table=new Table(cards.get(0),cards.get(1),cards.get(2),cards.get(3),4);
Vector<Integer> temp=new Vector<Integer>();
for(i=4;i<16;i++)
{
temp.add(cards.get(i));
}
pl1.set_cards(temp);
if(pl1.type=="human")
{
pl1.send(temp);
pl1.send(table.heaps.get(0).get(0));
pl1.send(table.heaps.get(1).get(0));
pl1.send(table.heaps.get(2).get(0));
pl1.send(table.heaps.get(3).get(0));
}
temp.clear();
for(i=16;i<28;i++)
{
temp.add(cards.get(i));
}
pl2.set_cards(temp);
if(pl2.type=="human")
{
pl2.send(temp);
pl2.send(table.heaps.get(0).get(0));
pl2.send(table.heaps.get(1).get(0));
pl2.send(table.heaps.get(2).get(0));
pl2.send(table.heaps.get(3).get(0));
}
System.out.println("Making Initial arrangements");
temp.clear();
for(i=28;i<40;i++)
{
temp.add(cards.get(i));
}
System.out.println("Making Initial arrangements");
pl3.set_cards(temp);
if(pl3.type=="human")
{
System.out.println("Making Initial arrangements");
pl3.send(temp);
pl3.send(table.heaps.get(0).get(0));
pl3.send(table.heaps.get(1).get(0));
pl3.send(table.heaps.get(2).get(0));
pl3.send(table.heaps.get(3).get(0));
System.out.println("Initial arrangement made");
}
for(i=40;i<52;i++)
{
mycards.add(cards.get(i));
}
playgame();
}
將長時間運行的操作轉移到另一個線程的一種方法是使用'SwingWorker'。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – 2013-02-22 07:43:58
其實這個問題的標題頗具誤導性。在這裏,代碼顯示前面的面板被刪除,並且在網絡部分或阻止操作開始之前連接了一個新面板。所以gui必須在掛起之前進行了更改, ,但它不會改變。 但是,如果我運行代碼到標記1(不包括所有網絡部分(這是通過貴公司更改代碼後的方式))它迅速工作。不理解此行爲 – nav 2013-02-22 10:11:22
@nav那麼這是你的標題。清楚地表達你的問題取決於你。目前你只是增加了混亂。我建議您徹底編輯標題和正文,以反映您實際要求的內容,或刪除它並重試。 – EJP 2013-02-22 22:16:18