2012-01-08 22 views
1

我有問題。 我使用循環繪製一些東西,並使用Sleep來暫停執行。 與此同時,我想能夠看到textArea中有什麼,它有很多線條,我必須向下滾動才能看到它們,但我不能。使用睡眠不可能。 有什麼建議嗎? 謝謝。暫停一個循環,但仍然能夠看到文字

+0

您將不得不將任何循環進入另一個線程。人們很難在這裏回答這個問題。如果將它分解到另一個線程是沒有意義的,則最好創建一個定時器並在每次調用定時器時執行循環任務(將定時器設置爲以與睡眠呼叫相同的時間間隔觸發。 。如果您在睡眠之前多次執行循環,只需在定時器調用期間執行多次循環) – 2012-01-08 20:42:54

+0

使用** threads **。 – 2012-01-09 06:34:31

回答

1

請勿在事件線程中使用睡眠。我假設你的是一個Swing應用程序(請告訴我們這是否正確),如果是這樣,在事件線程上調用Thread.sleep(...)將使整個GUI處於睡眠狀態,從而使其無響應。相反,如果這是一個Swing應用程序,請使用Swing Timer。

教程:How to Use Swing Timers

編輯1
注:這裏有許多建議使用SwingWorker類,而這些可能是有用的,但我會推遲使用它們,除非做需要的代碼在時間間隔之間非常耗費CPU時間並且需要一些時間來完成,比如讀取大中型文件。如果你所做的只是畫一個圓圈,然後暫停,然後畫另一個圓圈,一個SwingWorker總是矯枉過正,並且一個更容易實現的Swing Timer是一條可行的路線。

與所有建議,答案將取決於您遇到的具體問題,你不妨告訴我們更多。

+0

@ ada90:請參閱編輯1. – 2012-01-08 20:59:10

+0

編輯+1,當然,因爲在他提到的評論中他只想做一些繪畫(應該在EDT上發生),然後在下一次繪畫前等待一段時間 – Robin 2012-01-08 21:01:55

+0

@Robin :謝謝,並且+1也爲您提供了出色的答案。 – 2012-01-08 21:02:42

0

你需要記住基本循環的狀態(你得等),並停止添加。讓用戶滾動,當你想「取消暫停」時,從你想要的地方恢復循環。

或者,使用適當的SwingWorker等調用回傳到UI線程以影響UI,然後在另一個線程中休眠,在單獨的線程中執行循環。這不會影響用戶界面。儘管如此,它可能會非常費勁。

0

不幸的是,你還沒有發佈任何代碼段,並沒有解釋清楚這是什麼意思,你不能向下滾動文本區域。

但我可以假設你的UI被凍結,因爲你是在UI線程調用sleep()。可能是從你的超載paint()repaint()方法中調用?如果我的猜測是正確的,儘量做你的循環,並從單獨的線程睡覺。您可以使用SwingWorker

爲了讓您更具體的建議,我需要更多的信息。

+0

我必須在面板上畫一些東西,讓我們說6圈,併爲每一個我有一些信息,在另一個面板,其中包含textArea。當循環暫停時,我希望能夠從另一個面板中點擊textArea並將其向下滾動到其末尾。 – sonya 2012-01-08 20:52:09

1

你不應該調用UI線程上sleep,因爲這將阻止所有UI相關的操作(如你剛發現)。

用戶界面的典型用例是在工作線程上完成繁重的工作(例如,由SwingWorker類提供),並在工作完成時更新UI(或以特定間隔顯示進度) 。

如果要執行以一定的間隔一些代碼,您可以使用Timer(Swing的變種,而不是java.util版本),將執行在正確的線程其代碼和離開兩次執行之間的自由UI線程。

+0

非常感謝!我是Java初學者,你的迴應非常有用。它現在有效! – sonya 2012-01-08 21:17:02