3

我有以下类别:的Java SwingUtilities.invokeLater更新文本区

  • MainServer
  • TCPSERVER
  • UDPServer

我创建MainServer TCPSERVER和UDPServer类(启动)的新实例类,我的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

这部分看起来不错;作为参考,有一个工作示例[这里](http://stackoverflow.com/a/3245805/230513)。 – trashgod

+1

正如你所说,“这似乎没有工作”,请更精确地*你正在观察什么*实际*问题*。 – MvG

+0

嗨MvG,我有6个不同的类文件:* MainServerInit,* MainServer,* TCPServer * UPDServer *解码*结果。在解码和结果我处理任何我从我的客户获得。但MainServerInit类初始化MainServer,它启动GUI并包含printLog方法。在这个阶段,当我初始化一个也启动TCP和UDP服务器的MainServer实例时,我不确定访问MainServer服务器的哪个方法或sintaxis = new MainServer; server.printLog(“TCP Server()Error”,2);来自TCP,UDP,解码等。 – spicyramen

回答

1

考虑使用一个单独的记录帧作品,或至少与静态方法(或记录工厂静态方法),一个单独的日志类。对于您的应用程序,无论他们是否登录控制台,至JTextArea,...并且您肯定不希望只为记录目的传递MainServer实例。

然后,您的应用程序可以简单地“登录”这些消息,并且如果您想要在某个JTextArea上显示这些消息,则可以简单地添加一个处理程序,它可以完成此操作。然后可以在创建实际JTextArea的位置创建该处理程序,当然也可以在Event Dispatch Thread上创建日志消息append

使用一个体面的日志框架的其它优点是,你可以激活记录在每个阶级基础,在每个阶级基础配置日志记录级别,......和所有不进行任何更改你的代码。因此,这允许从已部署的应用程序收集“调试信息”(甚至可能包含您不想出现在JTextArea中但您想知道诊断问题的信息)。

2

NullPointerException发生在68行在嵌套在MultithreadedBarcodeReaderServer的匿名类中,推测可能是Runnable引用。人们可能会猜测textAreanull,因为log未被取消引用,而level是原始的。您需要在调试器中靠近该行来确定。还要验证您的GUI组件是在event dispatch thread上构建和操作的只有