gpt4 book ai didi

java - JTextPane 中的 log4j

转载 作者:行者123 更新时间:2023-12-04 06:04:19 25 4
gpt4 key购买 nike

我目前正在尝试让 Log4J 登录到 JTextPane .我想使用 TextPane 因为我想要基本的突出显示(例如,错误是红色的,信息是绿色的)。

我设置了两个记录器,一个(根记录器)将所有内容记录到一个文件中,另一个(guiLogger)仅在 JTextPane 中记录 GUI 上的一些错误和信息.

我目前面临的问题是,我无法附加到 TextPane 工作。我目前拥有的看起来像这样:

public class Log extends AppenderSkeleton{

private final JTextPane log;
private final StyledDocument doc;

public Log(){
super();
log = new JTextPane();
doc = log.getStyledDocument();
}

@Override
protected void append(LoggingEvent loggingEvent) {
try {
doc.insertString(doc.getLength(), "Hello World!", null);
} catch (BadLocationException e) {
e.printStackTrace();
}
}

public JTextPane getView(){
return log;
}
}

Log4J 配置文件如下所示:
# The root-logger should log everything.
log4j.rootLogger = DEBUG, file

# Append the logs to a file.
log4j.appender.file = org.apache.log4j.RollingFileAppender
# [...]

# The logger which logs on the GUI (just some user-information).
log4j.logger.guiLogger = INFO, gui

# Append the logs to the GUI
log4j.appender.gui = mypackage.Log
# Formatting of the output:
log4j.appender.gui.layout = org.apache.log4j.PatternLayout
log4j.appender.gui.layout.ConversionPattern = %m%n
append() -方法被调用, insertString() - 方法执行干净(它不进入 catch -block),但我在 GUI 的 TextPane 中看不到任何内容。

我试图解决这个问题:
  • 执行insertString() -使用 SwingUtilities.invokeLater() 的方法
  • 执行insertString() - 来自 SwingWorker 的方法
  • validate() 这样的方法, revalidate()repaint()JTextPane
  • 不使用全局 StyledDocument -object 但直接从 log 获取-实例:log.getStyledDocument().insertString(0, "Hello World!", info_log);
  • setText() -JTextPane 的方法(仅适用于构造函数)。

  • 由于 JTextPane没有 fireContentChanged() -方法(或类似方法),我有点迷路了。

    我玩了更多,发现了一些其他的东西:
  • StyledDocument得到更新(调用 getText() 表明文本已被插入)。
  • 当我调用 append()insertString() - 直接来自编译器的方法(在初始化 StyledDocumentJTextPane 之后),一切正常。

  • 此外,我通过将其添加到 append() 来检查哪个线程调用了该方法。 - 方法体:
    System.out.println("Thread: "+Thread.currentThread().getName());

    如果我只是从代码中的某处执行两个日志语句,它会显示以下内容:
    Thread: AWT-EventQueue-0
    Thread: AWT-EventQueue-0

    当我调用 append() - 直接来自 Log 的构造函数的方法-class(加上上面的两个日志语句),它显示以下内容:
    Thread: AWT-EventQueue-0
    Thread: AWT-EventQueue-0
    Thread: AWT-EventQueue-0

    第一次调用可能会附加文本。但其他两个不接缝工作。

    我的 GUI 是从 AWT-EventQueue 构建的通过使用 SwingUtilities.invokeLater() .这两个日志调用是在相同的上下文中进行的(因此也来自 EventQueue)。

    最佳答案

    文本 Pane 对 appender 是私有(private)的,并且您没有任何 getter。所以我猜 GUI 有一个文本 Pane ,而记录器有另一个它附加到的文本 Pane 。

    那,或者您从与 Log4j 实例化的 Log 实例不同的 Log 实例获取文本 Pane 。

    此外,appender 可能被多个线程使用,但 Swing 组件只能从事件调度线程访问。对文本 Pane 的每个附加都应该在 SwingUtilities.invokeLater() 内完成。称呼。

    关于java - JTextPane 中的 log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8546995/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com