具有不同线程的textarea中的JavaFX log4j

时间:2018-11-28 08:30:46

标签: javafx log4j

我正在尝试将log4j输出重定向到一个文本区域,但是由于我使用的是 Platform.runLater ,因此在操作结束时将其填充 有什么办法可以使用其他线程吗?

AppFX.java

public class AppFX extends Application {


public static void main(String[] args) {
    ConfHandler.initConf();
    launch(args);
}

@Override
public void start(Stage primaryStage)throws IOException {
    primaryStage.getIcons().add(new Image("file:src/main/resources/images/frameIcon.png"));
    FXMLLoader loader = new FXMLLoader();
    String currentPath = System.getProperty("user.dir");
    loader.setLocation(new URL("file:\\"+currentPath+"\\src\\main\\resources\\scenes\\TestsFrame.fxml"));
    Parent content = loader.load();
    primaryStage.setTitle("IGED Tests");
    Scene scene = new Scene(content);
    primaryStage.setScene(scene);
    primaryStage.show();
    TextAreaAppender.setTextArea(((EaaSCleanerController)loader.getController()).getLogTextArea());
}}

TextAreaAppender.java

public class TextAreaAppender extends WriterAppender {
private static volatile TextArea textArea = null;

public static void setTextArea(final TextArea textArea) {
    TextAreaAppender.textArea = textArea;
}

@Override
public void append(final LoggingEvent loggingEvent) {
    final String message = this.layout.format(loggingEvent);
    try {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                try {
                    if (textArea != null) {
                        if (textArea.getText().length() == 0) {
                            textArea.setText(message);
                        } else {
                            textArea.selectEnd();
                            textArea.insertText(textArea.getText().length(), message);
                        }
                    }
                } catch (final Throwable t) {
                    System.out.println("Unable to append log to textarea:" + t.getMessage());
                }
            }
        });
    } catch (final IllegalStateException e) {
    }
}}

log4j.properties

# Append the logs to the GUI
log4j.appender.gui=com.bp.nest.testauto.gui.TextAreaAppender
log4j.appender.gui.layout=org.apache.log4j.PatternLayout
log4j.appender.gui.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n

1 个答案:

答案 0 :(得分:0)

您应该将操作放在单独的线程上。然后,日志记录可以与您的操作并行发生。您永远不应阻塞GUI线程。