2010-07-27 37 views
1

我有一个GUI,其中有textarea和按钮等.........Java界面和线程

我有一个不同的类,它是一个不断运行的线程。我想在线程类中满足特定条件时将文本附加到textarea。

在包含textarea的类中,我为textarea设置了getter方法。我也已经将该类(包含textarea)声明为线程类中的一个变量。

我尝试调用变量上的textarea的get方法,之后调用append()方法,但textarea不会自行更新。

我在做什么错?

感谢您的帮助。

+0

尝试将标题更改为与问题更相关的内容。这样,查看商家信息的人就会知道问题所在。 – helios 2010-07-27 11:50:43

+0

“附加”方法是线程安全的。因此,如果您在GUI中看不到文本,那么您没有对可见文本区域的适当引用。也许你错误地创建了两个文本区域。尝试添加一个System.out.println(textArea.getText()),以便您可以查看是否将文本附加到可见文本区域。 – camickr 2010-07-27 14:35:35

回答

5

重点是您必须关心以下由Sun根据Swing的线程管理给出的指导方针,您可以看看here

您将了解的是,您必须根据您的具体情况,使用SwingUtilities.invokeLater(..)SwingUtilities.invokeAndWait(..)调度GUI相关事件。这是因为GUI事件由事件调度线程管理,您不应该在您自己的线程中管理它们。

+0

某些Swing文档(在JDK 7中较少...)指出某些方法是线程安全的。这些评论通常不同意实施或任何可能的实施。此外,尝试以线程方式使用此类方法的代码可能会有自己的线程错误。 – 2010-07-27 14:12:55

1

您不能从非UI线程调用UI方法。要从非UI线程调用方法,您必须使用一个UI特定的方法,该方法称“将一段代码发送到UI线程以供执行”。在SWT中,这是Display.getDefault().asyncExec(Runnable)。对于Swing,请使用SwingUtilities.invokeLater()

查看this article了解更多信息。