2012-02-03 119 views
4

我有一個奇怪的問題......我是一個相對較新的「愛好者」的Java程序員(我曾經在以前的職業生涯中攻擊Perl)真正的應用。 「主要類」是MyApp類,它創建了一個UserInputDialog實例。Java:第二個窗口是空的

UserInputDialog是一類我寫的extend小號JFrame,實現ActionListenerKeyListener,使用FlowLayout,並呈現給用戶一個JLabelJTextField,並取消/ OK JButton秒。當JTextField生成KeyEvent,其中keyReleased() == KeyEvent.VK_ENTER或者當「OK」JButton生成ActionEvent時,UserInputDialog進行一些輸入驗證,調用setVisible(false),然後調用MyApp.doSomething(JTextFieldInstance.getText())

這一切都完美的作品。但是現在我正試圖將一個進度窗口添加到MyApp,因爲doSomething()偶爾會花費相當長的時間來完成。

我創建ProgressWindow類,它擴展JFrame,使用BorderLayout,並扔在JProgressBarNORTHJScrollPane(包裝JTextArea)。 CENTER。當從ProgressWindowTester實例化並饋送測試數據時,ProgressWindow完美工作。它也能正常工作,如果我複製並粘貼從ProgressWindowTester循環考不上MyApp並沒有MyApp實例化UserInputDialog(即沒有什麼固有MyApp是造成這種行爲,這似乎是某種互動我不明白,在UserInputDialogProgressWindow之間)。

但是當我嘗試在MyApp使用ProgressWindow如預期,即ProgressWindow調用setVisible(真),我得到了一個空白的Swing窗口(在適當的大小,並與標題欄設置不當)。不出現JProgressBarJScrollPane/JTextArea組件。通過MyApp正確調用ProgressWindow方法(System.err.println()消息顯示正確的交互),一切似乎都正常工作,只是,應在ProgressWindow中顯示的組件不是。

我可以張貼代碼片段,但它是一種令人費解,而且我可能只是缺少明顯的東西...

我所熟悉的一般分離UI和業務邏輯(概念如我使用HTML::TemplateClass::DBICGI::Application時,構建Perl應用程序),但我不知道我在Java中「做對了」...

在此先感謝!

噢,我在兩種環境下的測試完全一樣:Mac OS X 10.6.8(「Snow Leopard」)上的javac 1.6.0_29;和Fedora 15 Linux發行版,內核2.6.31.10-3,LXDE桌面環境中的javac 1.7.0_02 [1]。

[1]直接從oracle.com下載;我; M不使用的OpenJDK(我知道JDK 7基於OpenJDK)或GCJ或類似的東西

+2

很難說沒有代碼,但可能是一個Swing線程問題,特別是如果在Swing線程上執行長時間運行的任務:http://java.sun.com/products/jfc/tsc/articles /threads/threads1.html – DNA 2012-02-03 22:29:57

回答

5

你有在Swing問題併發,你正在試圖做的鞦韆上事件長期運行的進程線程或EDT。由於此線程負責繪製所有組件並處理用戶輸入,因此如果它受到長時間運行的進程的束縛,則GUI將被有效凍結,直到該進程完成。關鍵是使用後臺線程(如SwingWorker提供的後臺線程)來處理長時間運行的進程,這樣事件線程就不會被鎖定。查看Concurrency in Swing瞭解更多信息。另請查看JProgressBar Tutorial瞭解有關如何使用進度條與後臺線程的其他見解。

此外,您不希望使用JFrame,其中對話框(如JDialog)更合適。此外,您還需要避免在Swing中使用KeyListeners。更好的做法是簡單地將ActionListener添加到JTextField中,因爲它的默認行爲是響應按鍵。

哦,歡迎來到StackOverflow.com!

+2

+1我同意!有一個相關示例[這裏](http://stackoverflow.com/a/4637725/230513)。 – trashgod 2012-02-04 01:28:32

+0

是的,還有另一個相關的例子[這裏](http://stackoverflow.com/questions/8251607/running-a-jframe-with-a-jprogressbar/8251620#8251620)。 – 2012-02-04 03:07:58

相關問題