2012-12-09 5 views
0

JLabel을 추가 할 JPanel이 있습니다. 그런 다음 모든 JLabel을 제거하고 새로운 JLabel을 추가하려고합니다.Revalidate and repaint - Java Swing

그래서 나는 다음을 수행하십시오

 panel.removeAll();panel.repaint(); 

     panel.add(new JLabel("Add something new"); 

     panel.revalidate(); 

이 잘 작동합니다. 다음과 같이 새 스레드를 시작하면 내 문제가 발생합니다.

panel.removeAll();panel.repaint(); 

    (1)panel.add(new JLabel("Add something new"); 

    panel.revalidate(); 

    //new thread to start - this thread creates new JLabels that should appear under (1) 
    firstProducer.start();    

    try { 

      firstProducer.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

그런 다음 원본 JLabel의 출력은 계속 표시됩니다. revalidate 프로세스는 장기 실행 작업이므로 firstProducer 스레드가 시작되고 재 검증이 진행 중이고 충돌이 발생하고 있음을 읽었습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+0

동기화 문제? –

+1

1) * "JLabel을 추가 할 JPanel이 있습니다."* 왜? 텍스트' ""로 GUI에 라벨을 붙이면 사용하기 쉽지만 보이지 않게됩니다. 2) 장기간 작동이 EDT 및 GUI에서 업데이트되었는지 확인하십시오. 장기 실행 태스크를위한'SwingWorker'를 구현하십시오. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. –

+0

도움말에 대한 환호 –

답변

4

문제는 firstProducer.join입니다. javadoc로 설명한대로

이 스레드가 죽을 때까지 기다립니다. 때까지

그래서 당신은 이벤트 발송 쓰레드를 차단하고 다른 Thread이 완료, 따라서 패널이 다시 칠하거나 재 검증하고 UI의 변경 사항을 볼 수 없습니다 수 없습니다.

자세한 내용은 Swing concurrency tutorial을 참조하십시오.

+0

thanks..will ... –