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上構建和操作的只有