2012-07-25 5 views
0

스윙에서 한 번의 클릭으로 jlabel.text를 여러 번 변경해야합니다. 이 코드에서 내가 dowork() 함수 전에 시작하고 중간에 진행로 설정() dowork 후 종료를 설정하는 설정 레이블 텍스트를 필요로 (JLabel의에서 상태 유형 및 dowork 오랜 시간 실행이) :스윙에서 버튼을 클릭하여 레이블 텍스트를 여러 번 바꿀 수 없습니다.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     status.setText("start"); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     status.setText("in progress"); 
     dowork(); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     status.setText("end"); 

} 

이 코드 상태는 종료로 설정되고 시작은 표시되지 않습니다.

+0

진행률 표시 방법에 대한 [진행률 자습서] (http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html)를 참조하거나 [예제 코드]에서 사용 가능한 예제를 확인하십시오. 하나] (http://stackoverflow.com/questions/8916721/java-swing-update-label/8917565#8917565) – Robin

답변

2

확인합니다. 작성된 방식대로, 리스너 메소드는 실행 중에 사용자 인터페이스를 고정 시키게됩니다. 사용자 인터페이스는 오랜 시간이 걸려 사용자 경험이 나빠질 수 있습니다.

JLabel으로 변경하면 텍스트가 첫 번째로 execute (즉, 시작)을 호출하기 직전에 SwingWorker; 둘째로 publish/process 메커니즘을 사용하여 SwingWorker은 사용자 인터페이스에서 중간 결과를 게시 할 수 있습니다. 세 번째, 메서드에서 SwingWorkerdoInBackground 메서드의 실행을 마자 마자 UI 스레드에서 다시 호출됩니다.

참조 : 오라클의 worker threads and SwingWorker에 대한 자습서, JavaDoc API documentation of the SwingWorker class.

2

절대로, 결코 결코 ETD

Thread.sleep, Thead.yield를 사용하지 않는, 예컨대 라벨이 변경되지 않는 이유가 있기 때문이다

IO 또는 데이터 처리 확장으로서 ETD 임의 차단 ​​작업을 수행 결코 ETD을 지연 시키거나 차단하여 다시 칠하는 요청을 처리하지 못하도록합니다.

난 당신이 현재 메인 UI 스레드가 아닌 다른 스레드에 doWork에서하고있는 일을하기 위해 (특히 그 doInBackground 방법)을 SwingWorker 인스턴스를 사용하려고 할 밖으로 Concurrency in Swing & The Event Dispatching Thread

관련 문제