我有問題。 我使用循環繪製一些東西,並使用Sleep來暫停執行。 與此同時,我想能夠看到textArea中有什麼,它有很多線條,我必須向下滾動才能看到它們,但我不能。使用睡眠不可能。 有什麼建議嗎? 謝謝。暫停一個循環,但仍然能夠看到文字
回答
請勿在事件線程中使用睡眠。我假設你的是一個Swing應用程序(請告訴我們這是否正確),如果是這樣,在事件線程上調用Thread.sleep(...)
將使整個GUI處於睡眠狀態,從而使其無響應。相反,如果這是一個Swing應用程序,請使用Swing Timer。
編輯1
注:這裏有許多建議使用SwingWorker類,而這些可能是有用的,但我會推遲使用它們,除非做需要的代碼在時間間隔之間非常耗費CPU時間並且需要一些時間來完成,比如讀取大中型文件。如果你所做的只是畫一個圓圈,然後暫停,然後畫另一個圓圈,一個SwingWorker總是矯枉過正,並且一個更容易實現的Swing Timer是一條可行的路線。
與所有建議,答案將取決於您遇到的具體問題,你不妨告訴我們更多。
@ ada90:請參閱編輯1. – 2012-01-08 20:59:10
編輯+1,當然,因爲在他提到的評論中他只想做一些繪畫(應該在EDT上發生),然後在下一次繪畫前等待一段時間 – Robin 2012-01-08 21:01:55
@Robin :謝謝,並且+1也爲您提供了出色的答案。 – 2012-01-08 21:02:42
你需要記住基本循環的狀態(你得等),並停止添加。讓用戶滾動,當你想「取消暫停」時,從你想要的地方恢復循環。
或者,使用適當的SwingWorker
等調用回傳到UI線程以影響UI,然後在另一個線程中休眠,在單獨的線程中執行循環。這不會影響用戶界面。儘管如此,它可能會非常費勁。
不幸的是,你還沒有發佈任何代碼段,並沒有解釋清楚這是什麼意思,你不能向下滾動文本區域。
但我可以假設你的UI被凍結,因爲你是在UI線程調用sleep()
。可能是從你的超載paint()
或repaint()
方法中調用?如果我的猜測是正確的,儘量做你的循環,並從單獨的線程睡覺。您可以使用SwingWorker
。
爲了讓您更具體的建議,我需要更多的信息。
我必須在面板上畫一些東西,讓我們說6圈,併爲每一個我有一些信息,在另一個面板,其中包含textArea。當循環暫停時,我希望能夠從另一個面板中點擊textArea並將其向下滾動到其末尾。 – sonya 2012-01-08 20:52:09
你不應該調用UI線程上sleep
,因爲這將阻止所有UI相關的操作(如你剛發現)。
用戶界面的典型用例是在工作線程上完成繁重的工作(例如,由SwingWorker
類提供),並在工作完成時更新UI(或以特定間隔顯示進度) 。
如果要執行以一定的間隔一些代碼,您可以使用Timer
(Swing的變種,而不是java.util
版本),將執行在正確的線程其代碼和離開兩次執行之間的自由UI線程。
非常感謝!我是Java初學者,你的迴應非常有用。它現在有效! – sonya 2012-01-08 21:17:02
- 1. 暫停循環並暫停
- 2. 停止循環文本,但仍運行
- 3. 我怎樣才能'爆發'的一個while循環,但仍然做while循環?
- 4. 需要能夠看到使用循環
- 5. 暫停循環
- 6. C#做一個延時,但仍然能夠有形式開放
- 7. 暫停while循環但while循環不應該停止
- 8. 暫停一個循環直到一個按鈕動作 - Java
- 9. 訂購一個列表,但仍然能夠訪問索引和字段
- 10. Term :: ReadKey在一個循環中暫停封閉循環
- 11. 不能暫停循環,因爲的MPMoviePlayerController
- 12. Linq2SQL:只選擇一些列,但仍然能夠提交更改
- 13. 程序暫停在循環
- 14. 在TweenJS循環後暫停
- 15. Powershell GUI和循環暫停
- 16. 暫停按熱鍵循環
- 17. 暫停打擊循環
- 18. 在Python中暫停循環
- 19. 暫停循環jQuery問題
- 20. EXCEL VBA:暫停 'For循環'
- 21. 暫停遊戲循環?
- 22. 音頻html5循環暫停
- 23. JavaScript中的循環暫停
- 24. Java在循環中暫停
- 25. 視頻已暫停,但其聲音仍然落後
- 26. Linux - 暫停循環,直到按下鍵
- 27. 暫停循環,直到用戶點擊一個按鈕
- 28. VB:如何暫停一個循環一定的時間,然後繼續?
- 29. QGraphicsItemAnimation在每個QTimeLine循環後暫停
- 30. 暫停。每個淡出循環
您將不得不將任何循環進入另一個線程。人們很難在這裏回答這個問題。如果將它分解到另一個線程是沒有意義的,則最好創建一個定時器並在每次調用定時器時執行循環任務(將定時器設置爲以與睡眠呼叫相同的時間間隔觸發。 。如果您在睡眠之前多次執行循環,只需在定時器調用期間執行多次循環) – 2012-01-08 20:42:54
使用** threads **。 – 2012-01-09 06:34:31