3

私は、NetBeans で実装された GUI アプリケーションを使用しています。ユーザーの入力から提供されるさまざまな機能については、ログに log4j を使用する jar が使用されます。すべて問題ありませんが、情報を log4j から GUI のテキスト領域にリダイレクトする必要があります。log4j から swing テキスト領域にリダイレクトするには、AppenderSkeleton を拡張する必要があることがわかりました。私の問題は、GUI を変更できないことです (たとえば、AppenderSkeleton を拡張する JTextArea を持つように)。そのため、JTextarea に追加するクラスが必要です。今、私のアプリケーションは前に初期化されますlog4j. 私の問題は、AppenderSkeleton カスタム クラスへのプロパティとして、私の gui の jtextarea への参照を設定する方法が見つからないことです。そのため、log4j がアペンダーを初期化するときに、アプリケーションのテキスト領域への参照が渡されます。log4j 構成ファイルで次のようなものを試してみました:うまくいかない。アペンダーを log4j で初期化し、情報をアプリケーションにリダイレクトするにはどうすればよいですか? または、アプリケーションがカスタム アペンダーを初期化し、それをログに使用するように log4j に通知する方法はありますか? ありがとうございました!

4

2 に答える 2

4

最も簡単なオプションは、GUI が初期化された後にプログラムでアペンダーを追加することです。このようなもの:

Logger.getRootLogger().addAppender(yourTextAreaAppender);

編集: INFO レベルのみをログに記録するには、次のようにします。

yourTextAreaAppender.addFilter(new Filter() {
    @Override
    public int decide(LoggingEvent event) {
        if (event.getLevel().equals(Level.INFO)) {
            return ACCEPT;
        } else {
            return DENY;
        }
    }
});
于 2010-09-10T21:18:45.837 に答える
1

まあ、これはかなり簡単かもしれません、

  1. log4j.propertyファイルでプロパティを指定します。私の場合は次のようになります。

    log4j.rootLogger=S
    log4j.appender.S=com.ibm.nzna.projects.qit.gui.StatusMessageAppender
    log4j.appender.S.layout=org.apache.log4j.PatternLayout
    log4j.appender.S.layout.ConversionPattern=%m
    
  2. Writeは、次のコードを持つ新しいクラスです。

    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.Level;
    import org.apache.log4j.spi.LoggingEvent;
    
    /**
     * @author Ashish Tyagi
     *
     */
    public class StatusMessageAppender extends AppenderSkeleton {
        private StatusBar statusBar = AppDefaultWin.getStatusBar();
        protected void append(LoggingEvent event) {
            if(event.getLevel().equals(Level.INFO)){
                    //here set the text of your swing component;
                   //in my case it is: statusBar.st_STATUS.setText(event.getMessage().toString());
            }
        }
    
        public void close() {
    
        }
        public boolean requiresLayout() {
            return false;
        }
    
    }
    
于 2011-09-01T12:40:16.227 に答える