0

Java로 게임을 개발 중입니다. 서버 측에서는 정보를 클라이언트에 보내기 전에 GUI를 변경합니다. 네트워킹 부분 (코드에서 태그 1)없이 실행하면 good.But 때 네트워킹 부분 (참고 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'를 사용하는 것입니다. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. –

+0

실제로이 질문의 제목은 오해의 소지가 있습니다. 여기서는 네트워킹 부분이나 차단 작업이 시작되기 전에 코드가 이전 패널이 제거되고 새 패널이 연결되었음을 보여 주므로 코드를 변경하기 전에 GUI를 변경해야합니다. , 그러나 그것은 변하지 않습니다. 그러나 태그 1 (모든 네트워크 부분 (GUI 변경 코드 다음에 오는 방법입니다))을 제외하고 코드를 실행하면 신속하게 작동합니다.이 동작을 이해할 수 없습니다. – nav

+0

@nav 글쎄 그것은 내 이름입니다. 질문을 분명하게하는 것은 당신에게 달려 있습니다. 지금 당장 당신은 혼란에 빠지게됩니다. 제목과 본문 모두를 철저하게 편집하여 실제로 묻고있는 것을 반영하거나 삭제 한 다음 다시 시도하십시오. – EJP