2011-07-13 47 views
2

我正在開發一個Java桌面應用程序,有時候我的jmenubar會顯示出來,有時它不會顯示。當它不是整個程序凍結,我必須殺死它。Java swing JMenuBar有時不顯示

我正在創建它並將其設置在框架的構造函數中。

代碼:


    // Load any settings we might have made from last time. 
    loadSettings(); 

    menuBar = createMenuBar(); 
    setJMenuBar(menuBar);  

    // re-evaluate and re-layout things, since they've been changed. 
    validate(); 


    addWindowListener(this);  

正如你可以在我的代碼中看到,我添加了一個validate()調用,希望這將有助於。它的確如此,但問題仍然不時發生。

在此先感謝您的幫助!

+5

請嘗試發佈[SSCCE](http://pscode.org/sscce.html)。 – Howard

+0

出於興趣,有人可以澄清爲什麼每個人似乎都會在他們的Swing示例中調用'validate()'嗎?我有一個整體的Swing應用程序,我寫了一次,並沒有調用它...是必要的還是不好的/好的設計實踐? – aardvarkk

+3

@aardvarkk - 我想說在大多數情況下,沒有必要這樣做。如果您使用佈局管理器,它應該自動處理大多數情況。一般來說,包括它的例子的擴散是(恕我直言)不理解揮杆漆系統如何真正起作用的症狀。 – wolfcastle

回答

4

的基本規則是這些:

  1. 驗證所有 GUI元件被構造在event dispatch thread

  2. 確認例外情況被吞噬,尤其是event dispatch thread

請注意,EDT會在拋出異常後自行重啓。根據具體情況,應用程序可能會凍結。雖然你應該應該看到在控制檯上的東西,文章Uncaught Exception Handlers可能會提供一些見解。

+2

太棒了 - 非常感謝。在我的代碼中,我沒有在事件派發線程中做任何事情。我會做出適當的修改,如果我仍然有問題,請回復。 – Richard

+0

可能有點早,但它看起來像修復了它。再次感謝!具體來說,我發現使用invokeAndWait()方法最適合我。 – Richard

+0

作爲參考,這[Q&A](http://stackoverflow.com/questions/7787998/how-to-generate-exceptions-from-repaintmanager/7788806#7788806)引用了一個相關的文章,證明特別有用。 – trashgod