2013-12-13 4 views
0

Jlabels의 배열이 있으며 각각에 imageIcon이 첨부되어 있습니다. 첨부 파일은 몇 번 호출 된 메서드에서 생성자 외부에서 발생하며 메서드의 끝에 repaint()를 사용합니다.이미지가있는 JLabel은 화면에서 지워지지 않습니다.

문제가

,하는 certin의 JLabel이 된 후 무승부, 나는 그에게 "열어 젖히다, 난 변경할 경우에도 JLabel의 (또는 이미지) null로 할 수 없습니다. 그냥 거기에있을 것입니다.

내가 배경색을 재설정하고 재 검증을 다시 칠려고, 비는 일을 할 것 같다

아이디어

편집 :.? 내가하려고 다음 (동부 서머 타임 내부) 및 배열의 마지막 JLable 만 변경하는 것 같습니다 :

for (int j = 0;j<playerCards.length;j++){ 
    remove(playerCards[j]); 
} 
+0

코드가 잘못되어 문제를 시연하는 'SSCCE'를 게시하지 않았기 때문에 코드가 잘못되었습니다. setIcon() 메서드가 작동합니다. repaint()를 사용할 필요조차 없습니다. 왜냐하면 레이블은 속성 중 하나가 변경 될 때 자체를 다시 그리기에 충분히 똑똑하기 때문입니다. – camickr

+0

부모 컨테이너에서'remove()'를 사용 했습니까? 나는 JLabel을 null로 바꾸는 것이 무엇을 의미하는지 모른다. 예를 들어,'JLabel [] arr; 그리고 나중에'arr [i] = null;'이 GUI에 아무런 영향을 미치지 않는다면 (당신의'JLabel []'배열). – ajb

답변

2

UI 작업을 EDT 스레드로 옮겨보십시오. 그들을 안으로 만들지 않으면 예기치 않은 결과가 발생할 수 있습니다.

EDT - 이벤트 발송 쓰레드

이 그것에 변경을 수행하는 유일한 스레드 있도록 GUI에 대한 변경 사항을 확인하기 위해 EDT 스레드를 사용해야합니다.

SwingUtilities.invokeLater( 
     new Runnable() { 
      public void run() { 
       //UI changes here 
      } 
     } 
    ); 
+1

메인 스레드에서 모든 oporations을 수행하더라도 이것이 필요합니까? –

+0

네, 자신이 아닌 다른 스레드가 수행 한 다른 업데이트 (잘 모르는 일을하는 EDT를 포함하여)는 두 번째 스레드에서 발생하므로 모든 UI 조정을 수행하는 것이 좋습니다. 스레드도. –

+2

@SaharZehavi, "main thread"를 정의하십시오. 리스너에서 코드를 실행하는 경우 해당 코드는 자동으로 EDT에서 실행됩니다. 커스텀 쓰레드를 생성한다면 invokeLater()를 사용할 필요가있다. 질문이 너무 모호하여 대답하기 어렵습니다. SSCCE를 게시해야하는 이유입니다. – camickr

-2

YOUR_OBJECT_CONTAINER이 JLabel의 제거하려는 포함 JComponent의를 확장하는 자바 객체입니다

SwingUtilities.updateComponentTreeUI(YOUR_OBJECT_CONTAINER); 

를 사용해보십시오.

+2

-1, 이것은 적절한 제안이 아닙니다. 이 방법은 LAF 변경에 사용됩니다. 스윙 구성 요소는 속성이 변경된 경우 자체를 다시 칠할만큼 똑똑합니다. – camickr