gpt4 book ai didi

JavaFx 和 StreamHandler

转载 作者:行者123 更新时间:2023-11-29 05:07:16 24 4
gpt4 key购买 nike

如何将日志重定向到 TextArea?我试过这样获取日志信息:

@Override
public void initialize(URL arg0, ResourceBundle arg1)
{
_Game.setText(getGSTextLog());

}

public void setGSTextLog(String text)
{
_gstext = text;
}

public String getGSTextLog()
{
return _gstext;
}

public void GameSteam() throws UnsupportedEncodingException
{
Logger logger = Logger.getLogger("test.test");
logger.setUseParentHandlers(false);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
StreamHandler sh = new StreamHandler(baos, new SimpleFormatter());
sh.setLevel(Level.ALL);
logger.addHandler(sh);

logger.severe("Console Test");

sh.flush();
int b = 0;
if (b == '\r')
{
return;
}
if (b == '\n')
{
final String text = baos.toString("UTF-8");
baos.reset();
Platform.runLater(() -> setGSTextLog(text + "\n"));
return;
}
baos.write(b);
}

最佳答案

直接实现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);
}
}

关于JavaFx 和 StreamHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927212/

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