2013-11-22 5 views
2

메인 프레임에서 자체 스레드로 생성되는 사용자 정의 JDialog에 문제가 있습니다.JDialog가 보이지 않습니다.

때로는 JDialog이 보이지 않지만 컨트롤이 클릭 가능합니다 (위치가 어디인지 알고있는 경우). 이 문제는 Oracle Java 1.7에서는 발생하지 않지만 Oracle Java 1.6에서는 발생합니다 (1.6.0_371.6.0_45 참조). 내 메인 프레임에서

class MyDialog extends Jdialog() { 
public MyDialog(JFrame frame, boolean modal) { 
    super(frame, modal); 
    [...] 
    } 
} 

:

는이 같은 대화 상자를 만들

MyDialog dialog = new MyDialog(myMainFrame,true); 
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL); 
dialog.setVisible(true); 

예상되는 동작은 그 위에 메인 프레임과 거짓말의 MouseEvents 같은 이벤트를 차단하는 것입니다. Java 1.7에서 완벽하게 작동합니다.

JDialogs 부모 프레임 (소유자)이 표시된 후 또는 사용 된 Java JRE의 알려진 버그 일 뿐이라는 점을 염두에 두어야 할 특별한 사항이 있습니까? 벌써 오라클 here의 버그 수정 로그를 확인했지만 성공하지 못했습니다.

+6

@subash가 제안하는대로'repaint()'또는'revalidate'를 호출 할 이유가 없어야합니다. 문제는 간헐적으로 들리며 스윙 스레딩 문제가 발생합니다. 당신은 EDT에서 모든 스윙 전화를 할 수 있도록 돌보고 있습니까? EDT에서 장기 실행 코드를 호출 하시겠습니까? 가장 좋은 점은 여기에 문제를 컴파일, 실행 및 재현하는 짧은 코드를 게시 할 수 있다면 [sscce] (http://sscce.org)입니다. –

+0

당신이 맞습니다, SSCCE는 더 좋을 것이지만, 제 문제는 큰 코드 프로젝트에 참여하고 있습니다. 그래서 sccce는 불행히도 제 문제를 재현하지 않을 것입니다. 나는 스레딩에 문제가있는 것 같아 @Durandal 힌트가 올바른 방향으로 나를 인도한다고 생각합니다. 그것이 왜 항상 일어나는 것이 아니라 단지 때때로 일어날지를 설명 할 것입니다. JAVA 1.6/1.7 문제는 다른 디자인과 관련이있을 수 있습니다. 당신의 도움을 주셔서 감사합니다! – alex

답변

2

는 문제가 있음을

그게 전부 그대로 true의 경우, "나는 정의 JDialog를 메인 프레임에 의해 자체 스레드에서 만든 에 문제가".

특히 이벤트 발송 스레드 이외의 다른 스레드에는 JComponent의 스윙 개체 인스턴스를 생성하면 안됩니다. Swing은 전적으로 스레드로부터 안전하지는 않습니다. SwingUtilities.invokeAndWait()/invokeLater()를 사용하여 EDT에 대한 확신이 없을 때 GUI 관련 코드를 실행할 수 있습니다.

관련 문제