从不同的地方向swing JTextArea发送消息

我有一个JTextArea总是在我的主应用程序窗口中显示(如果你愿意,可以使用日志),我想用它来显示系统中正在进行的活动(比如你用System.out.println做的模拟调试输出)( )如果条件或其他)

我指的是用户所做的高级事情(例如“成功加载文件”或“写入磁盘”,“已完成”等)

事情是这样的消息可以在我的系统中的任何地方生成,主要在另一个包中处理数据和计算的包,并且他们不知道GUI。

也许将消息保存到临时文件中并且textarea“监视”该文件的更改,如何才能完成?

最简单的方法是定义记录器接口:

package com.example.logging; public interface ActivityLogger { void logAction(String message); } 

然后将它传递给非GUI组件,这样它们就不会与特定的实现绑定:

 public class FileLoader { private ActivityLogger logger; public FileLoader(ActivityLogger logger){ this.logger = logger; } public void loadFile(){ // load stuff from file logger.logAction("File loaded successfully"); } } 

现在,创建一个写入文本组件的实现很简单:

 public class TextComponentLogger implements ActivityLogger{ private final JTextComponent target; public TextComponentLogger(JTextComponent target) { this.target = target; } public void logAction(final String message){ SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { target.setText(String.format("%s%s%n", target.getText(), message)); } }); } } // Usage: JTextArea logView = new JTextArea(); TextComponentLogger logger = new TextComponentLogger(logView); FileLoader fileLoader = new FileLoader(logger); fileLoader.loadFile(); 

您当然也可以使用标准日志记录框架(java.util.logging,slf4j,log4j等)并编写一个“写入”文本组件的appender。

设计可能相当复杂。 也许你可以在TextArea所在的类中使用像updateText()这样的公共访问方法。 然后你创建一种’resource’或’shared’类(只是一个普通的类),当你的main()运行时它将被一起初始化。 当创建包含TextArea的类时,将在“共享”类中放置一个实例(此共享类应该是单例),因此所有其他类都调用此“共享”类(可能是类似updateTextArea()的方法)它会做什么是通过该实例调用包含TextArea的类,并调用TextArea来更新文本。

消息控制台可能正是您要查找的内容。

Java还有一个“Logger”API。

您可以使用EventBus将GUI与应用程序的其他部分分离。 (我的博客有另一个介绍 )。 您可以执行以下操作:

 public class LogArea extends JTextArea { public static final String LOG_TOPIC = "logarea_topic"; public LogArea() { super(); // Read in the annotations, register self as a listener to the topic AnnotationProcessor.process(this); } @EventTopicSubscriber(topic=LOG_TOPIC) public void logEvent(String topic, String text) { append(text + "\n"); } } public class DomainClass { public void foo() { // Send out a notification throughout the system to whichever components // are registered to handle this topic. EventBus.publish(LogArea.LOG_TOPIC, "some text you want to appear in the log area"); } } 

在实际系统中,您可能希望将主题声明移动到另一个类,以便可以使用它而不必绑定到特定实现。 例如,您可以拥有一个仅包含主题的静态字符串常量的Topics类。 然后,您可以拥有多个类来监听这些主题并处理消息(例如,除了jtextarea组件之外,您还可以使用标准日志记录框架写入日志文件)。