2012-03-27 3 views
-2

Im Reversi 프로그램을 빌드하고 각 이미지 스위치 사이에 0.5 초 (예 : 먹기 기능에서 검정색에서 흰색으로)와 같은 프로그램을 지연해야합니다. 문제는 스레드가 나던 작업을 사용하는 것입니다. 변수를 올리면 나는 잘못된 결과를 얻는다. 스레드를 사용하지 않고 프로그램을 지연 시키려면 약간의 와트가 필요합니다. 필요할 때 사용할 수있는 기능이 있습니다.지연 자바 프로그램

public void func1(int turn) 
{ 
    int i,k; 
    for(i=0;i<8;i++) 
    for(k=0;k<8;k++) 
    { 
    if(eat[i][k]==turn) 
    { 
     board[i][k]=turn; 
     if(turn==1) 
      squares[i][k].setIcon(new ImageIcon("blkimg.PNG")); 
     else 
      squares[i][k].setIcon(new ImageIcon("whtimg.PNG")); 
    } 
    } 
} 

감사합니다.

+0

Java (질문 제목에서) : –

+0

Thread.sleep()을 사용할 때 "엉망이되는"것은 무엇입니까? – Exupery

+0

다른 스레드를 만들려고했는데 두 스레드가 동일한 변수를 사용하여 올바른 조각을 "뒤집어 썼습니다" – Sagi

답변

1

당신은 Thread.sleep()를 사용하여 잠을 현재의 1 점을 추가하는 듯 스레드의 광범위한 지식을 필요로하지 않습니다 - 나는 당신이 일반적인 문제입니다 정확 해요 경우 http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html

+0

하나씩 차례로 "뒤집기"하지 않습니다. 예를 들어 : 5 조각을 뒤집어서 5 초 0.5 초 기다렸다가 모두 뒤집어 쓴다. – Sagi

+0

어디서 잠을 잤니? 'Thread.sleep (500);''if (turn == 1) '바로 전에 찾고있는 것을 정확하게 처리해야합니다. – Exupery

+0

"board [i] [k] = turn; – Sagi

-1

나는 뭔가를 놓친가요? Thread.sleep()을 사용하여 현재 스레드를 절전 모드로 전환 할 수없는 이유는 무엇입니까? 코멘트에 대한 논의에 대응

는 :

당신은 GUI 스레드의 개념을 파악해야합니다. 모든 코드가 GUI 스레드에서 실행되고있는 경우, GUI는 "수행 중"으로 다시 그려지지 않습니다. 신속하고 지저분한 해결 방법은 필요에 따라 다시 그리기를 강제 실행하는 데 필요한 호출을 넣는 것입니다.

+0

1 정말로 스레드에서 새로운 것들은 정말로 그들을 사용하는 방법을 알지 못합니다. 그러나 나는 sleep func을 시도해 보았습니다. 그리고 그것은 모든 것을 뒤집어 놓지 않은 문제가있었습니다. – Sagi

+1

진정한 멀티 스레딩 응용 프로그램이 있습니까, 아니면 Thread.sleep()을 사용하여 문제가 해결되지 않았습니까? Thread.sleep()은 새로운 쓰레드를 생성하지 않는다. 현재 쓰레드를 잠자기 상태로 만든다. 아마도 당신은 잘못된 질문을하고 있습니까? 왜 연기해야한다고 생각하니? – John3136

+0

프로그램이 모든 조각을 한꺼번에 뒤집어서 사용자가 실제로 컴퓨터를 움직이는 것을 볼 수 없도록하려면 지연이 매우 중요합니다. – Sagi

1

에서 살펴 보는 것이 좋습니다.

Thread.sleep()을 사용하면 Swing이 인터페이스를 변경하는 데 사용하는 동일한 스레드 (정확하게 반응하지 않고 모든 변경 사항을 한 번에 표시하는 인터페이스)에서 지연을 일으킬 수 있습니다.

Concurrency in Swing에 대한 자세한 내용은 Java 자습서를 참조하십시오.

솔루션은 SwingWorker 클래스를 사용할 수 있으며 몇 달 전에 친구를위한 작은 샘플을 만들었습니다. available in GitHub입니다. Netbeans를 사용하지 않는 경우 this class (줄 90-98 및 151-165)을 살펴보십시오.

편집 : 이것이 단지 하나의 해결책 일 뿐이라는 사실을 반영하여 조정합니다. 다른 사람들이 지적했듯이 적어도 또 다른 좋은 대안이 있습니다.

+0

문제 일 수 있으니 해결하기가 어렵겠습니까? – Sagi

+1

SwingWorker의 모든 문제를 해결하기보다는이 간단한 지연을 위해 Swing Timer를 사용하는 것이 더 좋습니다. –

+0

나는 그 중 하나를 사용하는 방법을 모릅니다 ... 그것은 단지 간단한 0.5 초 지연을 위해 많은 것을해야한다는 어리석은 것처럼 보입니다. – Sagi

2

이것은 당신이 말하는 결코 스윙 응용 프로그램을 (로보고,이 매우 중요한 정보입니다. 그렇다면, 단순히 지연을 만들 Swing Timer를 사용합니다. 또한, 이미지 파일 읽기 보관하지 않습니다. 읽기 클래스 생성자에서 한 번만 이미지 아이콘을 만들고 변수 또는 배열 또는 컬렉션에 ImageIcon을 저장하십시오.

+0

감사합니다, 그 종류의 내 문제를 해결했지만 다른 하나가 등장했습니다. 프로그램은 처음부터 끝까지 모든 것을 뒤집어 쓰지 않습니다. 나는 "ActionListener taskPerformer = 새로운 ActionListener() {public void actionPerformed (ActionEvent evt) {"if (turn == 1) 전에 "timer2.stop(); = 새 타이머 (200, taskPerformer); timer2.start(); " "square [i] [k] .setIcon (new ImageIcon ("whtimg.PNG "));"다음에. – Sagi

+0

@ 사기 : 볼 수 있듯이 형식을 유지하지 못하고 읽을 수 없게되므로 주석에 코드를 게시하지 마십시오. 대신 원래 질문을 편집하고 새 코드와 설명을 원래 질문의 맨 아래에 추가 한 다음 다시 댓글을 달아서 보겠습니다. 많은 행운! –

+0

@ 사기 : 또한, * 정확하게 * 지연을 넣으시겠습니까? 방법과 지연이 무엇을해야 하는지를 자세히 기술 할 수 있습니까? 나는 당신의 게임에 대해 아무것도 모른다고 가정한다. –

관련 문제