2016-11-15 46 views
0

好的,所以這個問題在過去幾天一直困擾着我。在任何人評論它之前,是的,我已經使jframe可見並且已經添加了我需要的所有組件。此外,在將GUI設置爲可見並且調用activate()之前,所有組件都已添加好。JFrame打開空白,運行一個循環,然後顯示組件

所以我試圖運行的代碼,一對夫婦simeple線:

 g.setVisible(true); 
     g.activate(); 

夠簡單。 g是一個由我製作的GUI擴展JFrame的類製成的對象。而activate()是一種運行無限循環的方法,它只是在用戶告訴它退出之前執行一堆事情。但是,當程序到達g.setVisible()行時,它會打開一個我指定大小的JFrame,但是完全沒有任何東西。然後它移到g.activate();它目前運行一定次數的迭代和停止。在這一點上,它最終決定它可以返回並顯示我的GUI。與此相關的問題是,圖形用戶界面是由active()循環更新,並讓用戶知道發生了什麼。

任何幫助表示讚賞讓我知道,如果你需要更多detials,並提前感謝你。

+0

你可以給我們active()方法的代碼。欲瞭解更多信息 – msagala25

+1

如需更好的幫助,請儘快發佈[mcve],否則您的問題可能會因爲缺乏而被關閉;我不喜歡「......運行無限循環」的聲音,可能你想使用actionListeners來代替無限循環。也許你想要一個Swing Timer,並且可能把你的GUI放在EDT裏面,但是,我不能說這兩行代碼有什麼問題,我需要更多 – Frakcool

+0

不幸的是,我不能在actionListener中使用它,除非可以寫我的自己的actionListener。 –

回答

3

在許多不同的UI框架中,通常您調用的方法將一些工作排​​隊而不是立即執行。根據您的描述,似乎setVisible()可能正在創建本機窗口,但會對組件的渲染排隊。由於此代碼(可能)正在UI線程中運行,因此在運行activate()之前它不會執行它排隊的工作。

長時間運行的任務不應該在UI線程上運行。在Swing中,您可以使用SwingWorker或顯式創建後臺線程。

+0

(1+)閱讀[併發]上的Swing教程部分(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)以獲取更多信息。 – camickr

+0

@camickr你錯了;) –

+0

你是對的,我只需要在另一個線程上運行它,我可以相對容易地找到它。謝謝你的幫助。 –

相關問題