在我的主应用程序类中,我有一个 JTextArea 对象(比如 txtArea)。我在 main_application 程序中创建了另外两个线程。我创建的两个线程用于串口读写。现在我想把串口读缓冲区数据放到一个JTextArea对象中。所以我需要将在 main_application 中创建的 JTextArea 对象传递给 read-thread,以便 read-thread 可以将读取的输出放入 JTextArea。
但是在这样做之后我面临空指针访问问题。当我检查 main_application 中的 JTextArea 对象时,它不为空,但在传递给线程后,我检查了它的空值。我不知道它是怎么发生的....如果有任何极客可以帮助我我会很高兴....
谢谢, 苏尔佳
最佳答案
如另一个响应中所述,您只能在 swing 线程本身上更改 Swing 组件的内容。确保所有其他线程执行此操作的一个好方法是不公开实际的 JTextArea,而是为其他对象提供一种安全方法,以从您的 main_application 向文本区域添加文本,如下所示:
公共(public)类 main_application {
private JTextArea txtArea;
public void addText(final String txt) {
SwingUtilities.invokeLater(new Runnable() {
公共(public)无效运行(){
txtArea.setText(txtArea.getText() + txt);
}
});
}
}
这是一个简单的示例,但您可以根据需要对此进行扩展。这也使用了一种成本更高的添加到文本的方式,因为它附加了两个不可变的字符串。您可以使用 JTextArea.getDocument() 来检索模型,然后使用文档中的变异方法更有效地更新文本。但是,通过提供这样的方法,您可以在将来更改实现,而不会影响您的其他线程或对象。
注意参数txt 是final 是必需的,这样在匿名内部类中可以直接引用它。
您可能希望将其与您的主应用程序类分离,并为您想要从其他线程操作文本区域的方法/方式创建一个接口(interface)或类,然后将它们传递给一个包装的对象这个文本区域。
关于java - 如何将对象从主线程传递到java中的另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1794483/