我有问题。 我使用循环绘制一些东西,然后使用Sleep来暂停执行。 与此同时,我希望能够看到textArea中的内容,它有很多行,我必须向下滚动才能看到它们。但是我不能。使用Sleep它是不可能的。 有什么建议? 感谢。
答案 0 :(得分:1)
不要在事件线程上使用sleep。我假设你的是一个Swing应用程序(请告诉我们这是否正确),如果是这样,在事件线程上调用Thread.sleep(...)
将使你的整个GUI处于睡眠状态,使其无响应。相反,如果这是一个Swing应用程序,请使用Swing Timer。
编辑1
注意:这里有很多建议使用SwingWorker,这些可能很有用,但我会暂时不使用它们,除非需要在时间间隔之间完成的代码非常占用CPU并且需要一些时间来完成,例如在大中档文件中读取。如果你正在做的只是绘制一个圆圈,然后暂停,然后绘制另一个圆圈,那么SwingWorker就会严重过度杀伤,而且Swing Timer更容易实现,这是一种可行的方法。
与所有建议一样,答案将取决于您的问题的具体情况,您可能希望告诉我们更多。
答案 1 :(得分:1)
你永远不应该在UI线程上调用sleep
,因为这会阻止所有与UI相关的操作(正如你刚刚发现的那样)。
具有UI的典型用例是在工作线程上执行大量工作(例如由SwingWorker
类提供)并在工作完成时更新UI(或者以特定间隔更新显示进度)。
如果要以特定间隔执行某些代码,可以使用Timer
(Swing变体,而不是java.util
版本),它将在正确的线程上执行其代码并离开UI两次执行之间没有线程。
答案 2 :(得分:0)
你需要基本记住循环的状态(你需要去的地方等)并停止添加。让用户滚动,当你想“取消暂停”时,从你要去的地方恢复循环。
或者,在单独的线程中执行循环,使用适当的SwingWorker
等调用来封送回UI线程以影响UI,然后在另一个线程中休眠。这不会影响UI。尽管如此,它可能会变得非常繁琐。
答案 3 :(得分:0)
很遗憾,您还没有发布任何代码段,也没有明确说明您无法向下滚动文本区域是什么意思。
但是我可以假设你的UI被冻结了,因为你在UI线程中调用了sleep()
。可能是从您重载的paint()
或repaint()
方法调用的?如果我的猜测是正确的,请尝试循环并从单独的线程中休眠。您可以使用SwingWorker
。
为了给你更具体的建议,我需要更多的信息。