2013-01-16 3 views
2

그래서 저는 플레이어에 대해 Reversi/Othello를 사용하는 프로그램을 작성하고 있습니다. 나는 조각의 짧은 애니메이션 그것은 잘 작동하고 훌륭하지만 문제는 전체 프로그램을 일시 정지 Thread.sleep를하기 때문에, 만에 하나 개의 조각을 전환 할 수 있다는 것입니다전체 프로그램을 일시 중지하지 않고 메서드를 일시 중지하려면 어떻게해야합니까?

public void flip(int row, int col, Graphics window) 
{ 
Color a; 
if (pieces[row][col]==1) 
    a = Color.black; 
else 
    a = Color.white; 
for (int size = 90; size>0; size-=2) 
{ 
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){} 
    window.setColor(new Color(0, 100, 0)); 
    window.fillRect(row*100+3, col*100+3, 94, 94); 
    window.setColor(a); 
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size); 
} 
if (a==Color.black) 
    a=Color.white; 
else 
    a=Color.black; 
for (int size = 0; size<90; size+=2) 
{ 
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){} 
    window.setColor(new Color(0, 100, 0)); 
    window.fillRect(row*100+3, col*100+3, 94, 94); 
    window.setColor(a); 
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size); 
} 
} 

을 flipping- 수 있도록하는 방법을 썼다 시각. 프로그램의 나머지 부분을 중단시키지 않고 그 방법을 일시 중지 할 수있는 방법이 있습니까?

모두에게 감사드립니다. 새 스레드가 작동했지만 지금은 다른 문제가 있습니다. flip 메서드의 세 가지 setcolor 메서드가 서로 섞여 가고 있습니다. 일부 스레드는 녹색으로, 일부는 검정색으로, 일부는 흰색으로 설정하기 때문입니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

3

flip을 별도의 Thread으로 실행해야합니다. 가장 간단한 예제 :

Thread t = new Thread(new Runnable() { 
    public void run() { 
     flip(); 
    } 
}); 
t.start(); 
7

주 프로그램에서 만든 전용 스레드에서이 메서드를 실행해야합니다.

+1

+1 GUI 스레드에서 눈에 띄는 시간이 걸릴 수있는 작업을 수행하지 마십시오. 이 작업을 항상 앤서 스레드에 전달하고 SwingUtils.invokeLater를 사용하여 다른 스레드에서 GUI를 업데이트하십시오. –

1

애니메이션을 처리 할 별도의 스레드를 만들어야합니다. 이 스레드는 Thread#sleep을 호출 할 수 있습니다. Thread#sleep은 "전체 프로그램"을 일시 중지하지 않고 현재 스레드 만 일시 중지합니다. 애니메이션의 각 단계에서 조각 플립 애니메이션의 현재 스테이지를 나타내는 상태가 변경되고 다시 그리기를 요청해야합니다.

3

대상으로하는 것은 비동기 프로그래밍입니다. 실행될 때마다 하나의 애니메이션 단계를 수행하는 javax.swing.Timer을 예약하십시오. 이것은 GUI 프로그램의 관용적 방법 일 것입니다. 루프에서 잠들고 각 단계에서 invokeLater을 사용하는 별도의 스레드를 사용하는 접근 방식도 작동하지만 더 많은 시스템 자원 (대부분 잠들기 쉬운 다른 스레드)을 사용하기 때문에 덜 우아합니다.

관련 문제