2013-11-22 127 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時是否有任何特殊的事情需要記住,比如僅在創建它時,在parentframe(所有者)可見之後,或者它可能是已知的使用Java JRE的bug?我已經在Oracle here的錯誤修復日誌中檢查過,但沒有成功。

+6

應該沒有理由像@subash所說的那樣調用'repaint()'或'revalidate'。你的問題聽起來是間歇性的,這對我來說是一個Swing線程問題的味道。您是否在照顧美國東部時間的所有Swing電話?並且從美國東部時間撥打長時間運行的代碼?最好的是,如果你可以發佈編譯,運行和複製你的問題的短代碼,[sscce](http://sscce.org)。 –

+0

你是對的,SSCCE會更好,但我的問題是參與一個大型代碼項目,所以sccce不幸不會重現我的問題。我認爲@Durandal暗示使我朝着正確的方向發展,因爲它似乎是線程問題。這可以解釋爲什麼它不會總是發生,但有時只是發生。 JAVA 1.6/1.7問題可能與不同的設計有關。謝謝你的幫助! – alex

回答

2

「我有一個自定義的JDialog,就是在自己的線程由主框架創建問題」

如果那是完全正確的,該問題。

您不應該在除事件派發線程之外的任何其他線程上創建Swing對象的實例,尤其是JComponent。 Swing不完全是線程安全的,當你不確定你在EDT時,使用SwingUtilities.invokeAndWait()/ invokeLater()來執行與GUI相關的代碼。