JavaFX log4j в текстовой области с другим потоком - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь перенаправить вывод 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 голосов
/ 28 ноября 2018

Вы должны поместить свои действия в отдельную ветку.Тогда регистрация может происходить параллельно с вашими действиями.Вы никогда не должны блокировать GUI-поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...