2013-02-22 42 views
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(); 
} 

回答

4

的GUI掛起或從事在事件線程阻塞操作。所以不要這樣做。使用單獨的線程。

+4

將長時間運行的操作轉移到另一個線程的一種方法是使用'SwingWorker'。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – 2013-02-22 07:43:58

+0

其實這個問題的標題頗具誤導性。在這裏,代碼顯示前面的面板被刪除,並且在網絡部分或阻止操作開始之前連接了一個新面板。所以gui必須在掛起之前進行了更改, ,但它不會改變。 但是,如果我運行代碼到標記1(不包括所有網絡部分(這是通過貴公司更改代碼後的方式))它迅速工作。不理解此行爲 – nav 2013-02-22 10:11:22

+0

@nav那麼這是你的標題。清楚地表達你的問題取決於你。目前你只是增加了混亂。我建議您徹底編輯標題和正文,以反映您實際要求的內容,或刪除它並重試。 – EJP 2013-02-22 22:16:18