2012-01-08 70 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