只實現Handler
直接:
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LogToTextArea extends Application {
@Override
public void start(Stage primaryStage) {
Logger logger = Logger.getLogger("test.test");
logger.setUseParentHandlers(false);
TextArea log = new TextArea();
log.setEditable(false);
Formatter formatter = new SimpleFormatter();
logger.addHandler(new Handler() {
@Override
public void publish(LogRecord record) {
Platform.runLater(() -> log.appendText(formatter.format(record)));
}
@Override
public void flush() {}
@Override
public void close() {}
});
TextField sendToLog = new TextField();
sendToLog.setOnAction(e -> {
logger.info(sendToLog.getText());
sendToLog.setText("");
});
BorderPane root = new BorderPane(log, sendToLog, null, null, null);
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果你的心臟真的在使用StreamHandler
,有一個問題需要注意的設置是, StreamHandler
將其OutputStream
包含在OutputStreamWriter
中,其增加了緩衝。所以你可能想要確保處理器在每條日誌消息上刷新緩衝區。例如:
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.logging.StreamHandler;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LogToTextArea extends Application {
@Override
public void start(Stage primaryStage) {
Logger logger = Logger.getLogger("test.test");
logger.setUseParentHandlers(false);
TextArea log = new TextArea();
log.setEditable(false);
Formatter formatter = new SimpleFormatter();
StreamHandler handler = new StreamHandler(new OutputStream() {
@Override
public void write(int b) throws IOException {
String s = String.valueOf((char)b);
log.appendText(s);
}
}, formatter){
// flush on each publish:
@Override
public void publish(LogRecord record) {
super.publish(record);
flush();
}
};
logger.addHandler(handler);
TextField sendToLog = new TextField();
sendToLog.setOnAction(e -> {
logger.info(sendToLog.getText());
sendToLog.setText("");
});
BorderPane root = new BorderPane(log, sendToLog, null, null, null);
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}