2009-07-24 3 views
7

필자는 생각했던 것처럼 업데이트/다시 그리기를하지 않는 Java Swing UI가 있습니다. 앱이 XMPP 메시지를 보내고 다른 스레드에서 응답을받습니다. 해당 응답이 처리되고 메시지에 포함 된 정보를 반영하도록 UI가 업데이트됩니다. 응답이 수신 invokeLater를 사용한 후에 스윙 UI가 업데이트되지 않습니다.

, 나는

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
    public void run() { /* execute logic to update panel */ } 
}); 

이 상당히 언젠가 내가 자바로 개발,하지만 내 연구 온라인 invokeLater을 기반으로 한 이래로상의 실행을 위해 실행 가능한을 큐에있어 사용하여 JPanel의 구성 요소를 업데이트 GUI 스레드. 그러나 창 크기를 조정하는 등 다시 칠하는 응용 프로그램에서 다른 작업을 수행 할 때까지 내 GUI가 업데이트되지 않습니다. 내가 뭘 놓치고 있니? 패널을 업데이트하는 로직을 수행 한 후에 invalidate() 및 repaint()의 다양한 조합을 시도했지만 여전히 결과는 동일합니다. 즉, 창 크기를 조정할 때까지 GUI가 업데이트되지 않습니다.

편집 : 내가 패널을 업데이트한다고 할 때, 나는 구체적으로 removeAll()을 수행하고 몇 개의 JLabel을 추가하고 있습니다.

답변

14

패널에서 구성 요소를 추가/제거 후 사용한다 더 좋은 직업이며 Swing을 위해 특별히 추가되었습니다.

+0

수천 번 업데이트하고 싶습니다. – JCasso

2

구성 요소를 추가하거나 제거하는 "패널 업데이트"를 의미하는 경우 레이아웃 관리자가 변경 사항을 캐치 할 수 있도록 invalidate() 또는 revalidate()를 사용하는 것이 좋습니다.

비슷한 문제는 here을 참조하십시오.

2

doLayout()을 호출하는 GUI 이벤트 처리 중에 패널에서 구성 요소를 추가하거나 제거하는 경우 문제를 해결해야합니다. GUI가 업데이트되지 않고 validate(), doLayout() 및 repaint()를 호출하면 문제가 해결되는 경향이 있음을 발견했습니다. A는 않습니다) (내가 믿는

등의 validate(), 무효()와 같은

다른 물건은 AWT에서 남은된다

panel.revalidate(); // this works 99% of the time 
panel.repaint(); // sometimes needed. 
일을하고 재 검증 :

+1

실제로 doLayout()을 직접 호출하면 안되며 대신 revalidate()를 호출해야합니다. – Stroboskop

+0

@Stroboskop 설명서에 "구성 요소의 유효성을 검사 할 때 일반적으로 호출됩니다."라는 메시지가 표시됩니다. 내 경험에 따르면 이벤트 처리 중에 컨테이너에서 구성 요소를 추가 및 제거 할 때이 메서드는 revalidate()에 의해 호출되지 않습니다. – Peter

+0

오른쪽. 이 모든 것이 EventQueue에서 발생하기 때문에 완료 될 때까지 revalidate 플래그가 보지 않을 가능성이 높습니다. 하지만 나중에 repaint()를 호출하면 그림과 레이아웃이 모두 트리거 될 것입니다. – Stroboskop

관련 문제