我有以下课程:
我从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)
答案 0 :(得分:2)
NullPointerException
出现在嵌套在MultithreadedBarcodeReaderServer
的匿名类的第68行,可能是引用的Runnable
。可以猜测textArea
是null
,因为log
未被解除引用而level
是原始的。您需要在调试器中的那一行附近打破以确定。还要验证event dispatch thread上的仅是否构建和操作了GUI组件。
答案 1 :(得分:1)
考虑使用单独的日志记录框架工作,或至少使用静态方法的单独日志记录类(或使用静态方法的日志工厂)。对于您的应用程序,它们是否登录到控制台,JTextArea
,......并且您当然不希望仅为了记录目的而传递MainServer
实例。
然后你的应用程序可以简单地“记录”这些消息,如果你想在某个JTextArea
上显示那些消息,你可以简单地添加一个完全符合这个要求的处理程序。然后可以在与创建实际JTextArea
的位置相同的位置创建此处理程序,当然也可以在事件派发线程上append
日志消息。
使用合适的日志记录框架的其他优点是,您可以基于每个类激活日志记录,基于每个类配置日志记录级别,以及所有这些,而无需对代码进行任何更改。因此,这允许从已部署的应用程序收集“调试信息”(甚至可能是您不希望出现在JTextArea
中但您想知道诊断问题的信息)。