2017-04-15 1 views
0

많은 검색을 수행했기 때문에 내가 겪고있는 문제에 대한 해결책을 찾을 수 없습니다. Java의 JFrame으로 GUI를 설계하는 것은 상당히 간단하지만, setText 호출 이상일 때 시각적으로 업데이트하는 것은 훨씬 더 까다 롭습니다. 특히 시각적 인식을위한 대기 시간을 시뮬레이션하려는 경우 더욱 그렇습니다. 멀티 스레딩과 내가 찾은 모든 솔루션에 익숙하지 않아서 필자가 필요로했던 방식으로 작업 할 수 없었습니다.Java - 이미지 변경을 시뮬레이션하는 슬리핑 스레드

내가하려는 것은 간단한 주사위 게임의 특정 측면에 착륙하기 전에 주사위를 굴리는 것입니다. 이를 위해 주사위 이미지의 다른면을 설정된 횟수 (예 : 10) 씩 초 단위로 전환합니다 (이 경우 150 ms).

흥미로운 점은 현재 상태의이 코드는 시작시에 어떻게 제대로 작동하는지 (모든 사용자 입력을 수락하기 전에 한 번 전체 10 롤 사이클을 수행하지만 GUI의 모든 구성 요소는 표시됨) 예상대로 작동). 문제는 다시 롤링 할 때 모든 스레드가 대기 상태가 될 때까지 GUI가 공백이된다는 점입니다.

이런 종류의 일에 대한 지식이 부족하기 때문에 처음으로 원하는 방식으로 작동하는 이유는 알 수 없지만 이후에는 아무런 문제가 없습니다. 다행히도 나는 이것을 수행하기위한 올바른 방법이나 현재 내가하고있는 것에 대한 수정에 대한 도움을 얻을 수 있기를 바랍니다. 감사!

private void rollDice() 
{   
    for(int i = 0; i < 10; i++) 
    { 
     dice1 = (int) (Math.random() * 6) + 1; 
     dice2 = (int) (Math.random() * 6) + 1; 

     img1 = new ImageIcon(dice1 + ".png"); 
     img2 = new ImageIcon(dice2 + ".png"); 

     try 
     { 
      Thread.sleep(150); 
     } 
     catch(Exception e) 
     { 

     } 

     lbl1.setIcon(img1); 
     lbl2.setIcon(img2); 
    } 
} 
+0

JavaFx로 전환하십시오. – Sedrick

+0

문제는 메인 스레드에서 for 루프를 실행 중이며 GUI가 멈추는 것입니다. – Sedrick

+0

@SedrickJefferson 그럴 것입니다. 그러나 이것은 Java 지정을위한 것입니다. – Charles

답변

0

이 시도는 here입니다.

new Thread(new Runnable 
{ 
    public void run() 
    { 
     for(int count = 0; count < PREROLLS; count++) 
     { 
      //Add your for loop logic here! 

      SwingUtilities.invokeLater(new Runnable() { 
       public void run() 
       { 
         //then update you icon here. I would start with one die if I were you. 
         imgDice1 = new ImageIcon(path + dice1 + ".png"); 
       } 
      }); 
      try { Thread.sleep(100); } catch(Exception e) {} 
     } 
    } 
}).start(); 
+0

이 답변으로 내 문제를 해결할 수는 없었지만 (이전에 제기 한 의견은 내가 원한대로 해답을 찾는데 도움이 되었기 때문에이를 허용 된 대답으로 표시했습니다. 본질적으로, 내가 한 모든 것 : new thread() {public void run() {/ * 이전 주사위 롤 코드 + 스레드 종료 코드 * /}} .start(); 답변보다 훨씬 간단하지만 필요한만큼 작동합니다. 감사! – Charles

+0

@Charles 이것은 좋은 해결책이 아닙니다. 원하는 것을 얻기 위해 스윙 타이머 나 스윙 워커를 살펴 봐야합니다. – nachokk

+0

실제로이 답변을 올바른 것으로 받아들이지 마십시오. 나는이 답변을 삭제할 수 있으며 문제를 해결하기 위해 한 일을 게시 할 수 있습니다. 그렇게하면 미래에 누군가가 똑같은 문제를 겪는다면 좋은 대답을 할 수 있습니다. – Sedrick

관련 문제