I have the following classes:
I create new instances of TCPServer and UDPServer classes (start) from MainServer class, where my GUI is initialized. In this GUI I have a textArea, which either TCP or UDP classes needs to update to display log information (errors, status, etc). I did some search and I know i may need to use EDT in MainServer, but dont know how to access this object in MainServer class from TCPServer or UDPServer. Right now I can only print to console which is undesirable. How to access MainServer.printlog from TCPServer? or Mainserver.textArea object? If I create a new MainServer instance from TCPServer or UDPServer this seems not to be working.
This is my function in MainServer class:
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);
}
}
);
}
Edit: I tried to create a new instance of MainServer
and access printLog
but I get:
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)
Consider using a separate logging frame-work, or at least a separate logging class with static methods (or a logging factory with static methods). For your application, it should't matter whether they log to the console, to a JTextArea
, ... and you certainly do not want to pass the MainServer
instance around only for logging purposes.
Then your application can simply 'log' those messages, and if you want to display those on a certain JTextArea
, you can simply add a handler which does exactly this. This handler can then be created in the same location as where you create the actual JTextArea
, and of course can append
the log messages on the Event Dispatch Thread.
Other advantages of using a decent logging framework are that you can activate the logging on a per-class basis, configure the logging level on a per-class basis, ... and all that without making any changes to your code. So this allows to gather "debug-information" from a deployed application (perhaps even information you do not want to appear in the JTextArea
but you want to know to diagnostic a problem).