我有问题。 我使用循环绘制一些东西,并使用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. 暂停循环
- 4. Term :: ReadKey在一个循环中暂停封闭循环
- 5. Linq2SQL:只选择一些列,但仍然能够提交更改
- 6. Java在循环中暂停
- 7. 暂停循环jQuery问题
- 8. 暂停按热键循环
- 9. 暂停游戏循环?
- 10. 暂停打击循环
- 11. Powershell GUI和循环暂停
- 12. 在TweenJS循环后暂停
- 13. 程序暂停在循环
- 14. 音频html5循环暂停
- 15. 在Python中暂停循环
- 16. Linux - 暂停循环,直到按下键
- 17. 暂停循环,直到用户点击一个按钮
- 18. VB:如何暂停一个循环一定的时间,然后继续?
- 19. QGraphicsItemAnimation在每个QTimeLine循环后暂停
- 20. jQuery循环暂停悬停在下一个/ prev
- 21. 如何暂停一个jQuery while循环有条件暂停长度
- 22. 如何有一个默认的方法,但仍然能够覆盖它?
- 23. Actionscript循环在重复循环前的最后一帧暂停
- 24. 如何隐藏水平滚动条,但仍然能够滚动
- 25. 避免竞争条件,但仍然能够回滚
- 26. 删除标题栏,但仍然能够调整
- 27. immutableList但仍然能够修改列表中的元素
- 28. 如何gdb命令“直到”能够跳过一个循环?
- 29. JS文本循环与上一个,暂停和下一个按钮
- 30. 暂停异步循环,然后继续处理
您将不得不将任何循环进入另一个线程。人们很难在这里回答这个问题。如果将它分解到另一个线程是没有意义的,则最好创建一个定时器并在每次调用定时器时执行循环任务(将定时器设置为以与睡眠呼叫相同的时间间隔触发。 。如果您在睡眠之前多次执行循环,只需在定时器调用期间执行多次循环) – 2012-01-08 20:42:54
使用** threads **。 – 2012-01-09 06:34:31