3

私は次のクラスを持っています:

  • メインサーバー
  • TCPサーバー
  • UDPサーバー

GUI が初期化されている MainServer クラスから、TCPServer および UDPServer クラス (開始) の新しいインスタンスを作成します。この GUI には、ログ情報 (エラー、ステータスなど) を表示するために TCP または UDP クラスのいずれかが更新する必要があるtextAreaがあります。私はいくつかの検索を行い、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ようになります:

スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException
    MultithreadedBarcodeReader.MultithreadedBarcodeReaderServer$2.run(
        MultithreadedBarcodeReaderServer.java:68)
    java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682) で
    java.awt.EventQueue.access$000 (EventQueue.java:85) で
    java.awt.EventQueue$1.run(EventQueue.java:643) で
    java.awt.EventQueue$1.run(EventQueue.java:641) で
4

2 に答える 2

2

は、おそらく引用された にNullPointerExceptionネストされた無名クラスの 68 行目に発生します。は逆参照されておらず、プリミティブであるため、 であると推測できます。確認するには、デバッガーでその行の近くでブレークする必要があります。また、GUI コンポーネントがイベント ディスパッチ スレッド上でのみ構築および操作されていることも確認してください。MultithreadedBarcodeReaderServerRunnabletextAreanullloglevel

于 2012-09-03T01:07:39.060 に答える
1

別のロギング フレームワークを使用するか、少なくとも静的メソッドを使用する別のロギング クラス (または静的メソッドを使用するロギング ファクトリ) を使用することを検討してください。あなたのアプリケーションにとって、コンソールにログを記録するか、にログを記録するかは問題でJTextAreaはありませんMainServer

次に、アプリケーションはこれらのメッセージを単に「ログに記録」できます。特定の にそれらを表示したい場合は、JTextAreaまさにこれを行うハンドラーを追加するだけです。このハンドラーは、実際の を作成した場所と同じ場所に作成できます。JTextAreaもちろんappend、イベント ディスパッチ スレッドにメッセージを記録することもできます。

適切なロギング フレームワークを使用することのその他の利点は、クラスごとにロギングを有効にしたり、クラスごとにロギング レベルを設定したりできることです。コードを変更する必要はありません。したがって、これにより、デプロイされたアプリケーションから「デバッグ情報」を収集できます (おそらく、表示したくないがJTextArea、問題を診断するために知りたい情報であっても)。

于 2012-09-03T07:19:09.480 に答える