暂停循环,但仍然能够看到文本

时间:2012-01-08 20:36:38

标签: java textarea sleep

我有问题。 我使用循环绘制一些东西,然后使用Sleep来暂停执行。 与此同时,我希望能够看到textArea中的内容,它有很多行,我必须向下滚动才能看到它们。但是我不能。使用Sleep它是不可能的。 有什么建议? 感谢。

4 个答案:

答案 0 :(得分:1)

不要在事件线程上使用sleep。我假设你的是一个Swing应用程序(请告诉我们这是否正确),如果是这样,在事件线程上调用Thread.sleep(...)将使你的整个GUI处于睡眠状态,使其无响应。相反,如果这是一个Swing应用程序,请使用Swing Timer。

教程:How to Use Swing Timers

编辑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

为了给你更具体的建议,我需要更多的信息。