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();
}
장기 실행 작업을 다른 스레드로 전환하는 한 가지 방법은 'SwingWorker'를 사용하는 것입니다. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. –
실제로이 질문의 제목은 오해의 소지가 있습니다. 여기서는 네트워킹 부분이나 차단 작업이 시작되기 전에 코드가 이전 패널이 제거되고 새 패널이 연결되었음을 보여 주므로 코드를 변경하기 전에 GUI를 변경해야합니다. , 그러나 그것은 변하지 않습니다. 그러나 태그 1 (모든 네트워크 부분 (GUI 변경 코드 다음에 오는 방법입니다))을 제외하고 코드를 실행하면 신속하게 작동합니다.이 동작을 이해할 수 없습니다. – nav
@nav 글쎄 그것은 내 이름입니다. 질문을 분명하게하는 것은 당신에게 달려 있습니다. 지금 당장 당신은 혼란에 빠지게됩니다. 제목과 본문 모두를 철저하게 편집하여 실제로 묻고있는 것을 반영하거나 삭제 한 다음 다시 시도하십시오. – EJP