Java SwingUtilities.invokeLater更新TextArea

时间:2012-09-02 21:28:51

标签: java multithreading swing event-dispatch-thread invokelater

我有以下课程:

  • MainServer
  • TCPSERVER
  • UDPServer

我从MainServer类创建TCPServer和UDPServer类(start)的新实例,我的GUI初始化。 在此GUI中,我有一个 textArea ,TCP或UDP类需要更新才能显示日志信息(错误,状态等)。我做了一些搜索,我知道我可能需要在MainServer中使用EDT,但是不知道如何从TCPServer或UDPServer访问MainServer类中的这个对象。现在我只能打印到不受欢迎的控制台。 如何从TCPServer访问MainServer.printlog?还是Mainserver.textArea对象? 如果我从TCPServer或UDPServer创建一个新的MainServer实例,这似乎不起作用。

这是我在MainServer类中的功能:

public void printLog (final String log, final int level) {

    SwingUtilities.invokeLater(
    new Runnable() 
    {
        public void run() 
        {
        if (level == 1) 
            textArea.append("INFO\t" + log);
        if (level == 2)
            textArea.append("WARN\t" + log);
        if (level == 3)
            textArea.append("ERROR\t" + log);
        }
    }
    );
}

修改:我尝试创建MainServer的新实例并访问printLog,但我得到了:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at MultithreadedBarcodeReader.MultithreadedBarcodeReaderServer$2.run(
        MultithreadedBarcodeReaderServer.java:68)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:643)
    at java.awt.EventQueue$1.run(EventQueue.java:641)

2 个答案:

答案 0 :(得分:2)

NullPointerException出现在嵌套在MultithreadedBarcodeReaderServer的匿名类的第68行,可能是引用的Runnable。可以猜测textAreanull,因为log未被解除引用而level是原始的。您需要在调试器中的那一行附近打破以确定。还要验证event dispatch thread上的是否构建和操作了GUI组件。

答案 1 :(得分:1)

考虑使用单独的日志记录框架工作,或至少使用静态方法的单独日志记录类(或使用静态方法的日志工厂)。对于您的应用程序,它们是否登录到控制台,JTextArea,......并且您当然不希望仅为了记录目的而传递MainServer实例。

然后你的应用程序可以简单地“记录”这些消息,如果你想在某个JTextArea上显示那些消息,你可以简单地添加一个完全符合这个要求的处理程序。然后可以在与创建实际JTextArea的位置相同的位置创建此处理程序,当然也可以在事件派发线程上append日志消息。

使用合适的日志记录框架的其他优点是,您可以基于每个类激活日志记录,基于每个类配置日志记录级别,以及所有这些,而无需对代码进行任何更改。因此,这允许从已部署的应用程序收集“调试信息”(甚至可能是您不希望出现在JTextArea中但您想知道诊断问题的信息)。