我是一位没有经验的Java开发人员,负责编写处理备份的应用程序。
我的应用程序打开一个gui(使用NetBeans模板编写的StepTwoBackup),它从用户那里收集一些信息,然后当我按下" Next"按钮,gui将这些信息传递给一个对象(使用Log4J记录所有操作的BackupRestore),然后打开另一个窗口(StepThreeBackup)并将对象传递给它。
在这个新窗口(StepThreeBackup)中,我自动为传递的对象(BackupRestore.execute())启动一个方法,该方法执行备份。 在最后一个窗口(StepThreeBackup)中,我创建了一个JTextArea,我想在其中显示Log4J的输出(当前写入日志文件并输出到控制台)。
有办法做到这一点吗?我已经读过我应该使用appender,但无法弄清楚如何正确地做到这一点。
暂时我在我的工作Log4J属性文件中创建了以下条目:
<appender name="guiAppender" class="BackupAppGui.StatusMessageAppender">
<param name="Threshold" value="INFO" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss} %5p %c{1} - %m%n"/>
</layout>
</appender>
然后我的包中的以下类(在另一篇文章之后):
包BackupAppGui;
/**
*
* @author MSTPA
*/
import javax.swing.JTextArea;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
public class StatusMessageAppender extends AppenderSkeleton {
private final JTextArea jTextA;
public StatusMessageAppender() {
jTextA = StepThreeBackup.getJTextA();
}
protected void append(LoggingEvent event)
{
if(event.getLevel().equals(Level.INFO)){
jTextA.append(event.getMessage().toString());
}
}
public void close()
{
}
public boolean requiresLayout()
{
return false;
}
}
但没有任何内容写入jTextArea。
我做错了什么?有人可以帮我解决这个问题吗?感谢您提供给我的所有帮助。
答案 0 :(得分:1)
您需要确保JTextArea的实例不是null
。 Yoy可以尝试以编程方式添加appender(例如在创建组件后在StepThreeBackup
的构造函数中):
StatusMessageAppender appender = new StatusMessageAppender();
LogManager.getRootLogger().addAppender(appender);
不要忘记删除log4j.xml
文件中的条目。