2012-09-08 1 views
1

내 프로그램에 어떤 문제가 있는지 잘 모르겠습니다. 스레드를 만들지는 않더라도 스레드의 문제 일 수 있다고 생각합니다. 내가 가지고있는 것은 Minesweeper 게임을 구현하는 세 가지 클래스입니다. 하나는 81 (9 x 9) 버튼에 사용되는 확장 JButton 클래스 MineButton입니다. 두 번째는 MineButton을 포함하는 확장 컨테이너 클래스 MineField입니다. 그런 다음 MineField 객체가 포함 된 Class Minesweeper 클래스가 있습니다. 나는 그것의 많은 작동합니다. 이제는 Minewseeper 클래스가 MineButton 클래스의 정적 정보에 액세스하게하려고합니다. 여기 어떻게해야하는지 잘 모르겠습니다. (나는 믿는다) 필드와 버튼이 초기화되고 표시 준비가 된 후에. Mineweeper 객체를 무한 루프에 보내어 MineButton 클래스의 정보를 지속적으로 업데이트합니다. 이 작업을 수행 할 때 애플릿이 튀어 나오지만 내용은 표시되지 않습니다. showStatus는 0을 표시합니다. 어떤 것이되어야 하는가. 도움 주셔서 감사합니다.JApplet 디스플레이

다음은 지뢰 찾기 클래스

public class Minesweeper extends JApplet 
    { 
     MineField field; 
     public void init() 
     { 
      field = new MineField(9,9); 
      getContentPane().add(field); 
      setSize(field.getSize()); 
     } 

     public void start() 
     { 
      // trying to fix my problem. Wondering if not ready for display 
      field.setNumbers(); 
      while(!field.initialized()); 


      while(true) 
      { 
       showStatus(MineButton.flagCount + ""); 
      } 
     } 
    } 
+0

'필드 = 새로운 광산이 필드를 (9,9)가 무엇 않습니다

while(true) { showStatus(MineButton.flagCount + ""); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(Str.class.getName()).log(Level.SEVERE, null, ex); } } 

더 나은 솔루션은 타이머를 설정, 그래서 대신 while 루프하는 것? 광산과 들판 사이에 공간이 있습니다. –

+0

실제 프로그램에서는 단일 간격입니다. 그것은 UI를 만들고 설정합니다. Field는 MineButton의 컨테이너입니다. 거기에 while (true) 루프가 없으면 완벽하게 작동합니다. – user1266174

답변

3

당신이 상태를 새로 고침 사이에 약간의 지연을 추가하는 것입니다 할 수있는 최소입니다. 지금은 전체 CPU를 사용하고 있고, 바쁜 대기가 아주 나쁜 습관 일뿐만 아니라, 스윙 스레드는 점프하여 물건을 그릴 수 없습니다. `할;

int delay = 1000; //milliseconds 
ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     showStatus(MineButton.flagCount + ""); // need to make sure that you can call showStatus 
    } 
}; 

new javax.swing.Timer(delay, taskPerformer).start(); 
+0

아이디어를 주셔서 감사합니다. 그것은 문제의 일부 일지 모르지만 여전히 '일하지 않습니다. – user1266174

+0

방금 ​​읽은 다음 댓글의 두 번째 부분을 시도했습니다. 그것은 완벽하게 작동했습니다. 왜 하나가 효과가 있고 다른 하나는 그렇지 않은지에 대한 설명을 해주실 수 있습니까? 그리고 나 자신을 위해 더 많은 것을 읽을 수있는 웹 사이트일까요? 고마워. – user1266174

+1

설명 할 수있는 문서의 일부 텍스트를 제공 할 수 있습니다. '초기화 후에 작업을 수행하는 모든 애플릿 (사용자 작업에 대한 직접 응답 제외)은 start 메소드를 대체해야합니다. start 메소드는 애플릿의 실행을 시작합니다. 시작 방법에서 빨리 돌아 오는 것이 좋습니다. 연산 집약적 인 연산을 수행해야한다면이 목적을 위해 새로운 스레드를 시작하는 것이 더 나을 것입니다.'분명히 당신은'start()'에서 많은 것을하지 말아야합니다. Timer는 자체 스레드에서 실행되며 애플릿의 기본 스레드를 방해하지 않습니다. –