【发布时间】:2020-12-22 08:18:41
【问题描述】:
我想将 Console 中的输出重定向到 JavaFX TextArea,我在这里遵循一个建议:JavaFX: Redirect console output to TextArea that is created in SceneBuilder
我尝试在 PrintStream() 中将字符集设置为 UTF-8,但 it does not look so well。将字符集设置为 UTF-16 会有所改善,但 it is still illegible。
在 Eclipse IDE 中,控制台中假定的文本输出结果很好:
KHA khởi đầu phiên giao dịch sáng nay ở mức 23600 điểm, khối lượng giao dịch trong ngày đạt 765 cổ phiếu, tương đương khoảng 18054000 đồng.
Controller.java
public class Controller {
@FXML
private Button button;
public Button getButton() {
return button;
}
@FXML
private TextArea textArea;
public TextArea getTextArea() {
return textArea;
}
private PrintStream printStream;
public PrintStream getPrintStream() {
return printStream;
}
public void initialize() {
textArea.setWrapText(true);
printStream = new PrintStream(new UITextOutput(textArea), true, StandardCharsets.UTF_8);
} // Encoding set to UTF-8
public class UITextOutput extends OutputStream {
private TextArea text;
public UITextOutput(TextArea text) {
this.text = text;
}
public void appendText(String valueOf) {
Platform.runLater(() -> text.appendText(valueOf));
}
public void write(int b) throws IOException {
appendText(String.valueOf((char) b));
}
}
}
UI.java
public class UI extends Application {
@Override
public void start(Stage stage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
Parent root = loader.load();
Controller control = loader.getController();
stage.setTitle("Title");
stage.setScene(new Scene(root));
stage.show();
control.getButton().setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
try {
System.setOut(control.getPrintStream());
System.setErr(control.getPrintStream());
System.out.println(
"KHA khởi đầu phiên giao dịch sáng nay ở mức 23600 điểm, khối lượng giao dịch trong ngày đạt 765 cổ phiếu, tương đương khoảng 18054000 đồng.");
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Sample.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane prefHeight="339.0" prefWidth="468.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/11.0.1" fx:controller="main.Controller">
<center>
<TextArea fx:id="textArea" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</center>
<right>
<Button fx:id="button" mnemonicParsing="false" onAction="#getButton" text="Button" BorderPane.alignment="CENTER" />
</right>
</BorderPane>
我还是 Java 新手,所以我不熟悉 PrintStream 或 OutputStream 究竟是如何工作的。请原谅我的无知。
每一个建议都值得赞赏。
【问题讨论】:
-
好吧,我尝试在 Controller 的 initialize() 中添加
textArea.setFont(new Font("TimesRoman", 14));,但我仍然得到相同的结果。我应该使用哪些其他字体? -
嗯。问题是,我对字符编码/解码的复杂性并不熟悉。但我觉得
String.valueOf((char) b)可能是个问题。b是单个“字节”(0 到 255 之间的值)。然而,如果我没记错的话,UTF-8 中的某些字符由多个字节表示。 -
问题代码似乎得到了支持,因为直接使用您的字符串文字调用
setText(...)工作正常(至少在使用-encoding UTF-8编译源文件时)。 -
我可以使用
setText(...)将控制台输出推送到TextArea 吗?也许将控制台输出放入一个字符串(或其他东西?)然后 setText() 呢? -
解决问题的不是
setText。当我说代码与setText一起工作时,问题不在于TextArea,而在于如何将字节解码为字符。我用一个例子添加了一个答案。
标签: java javafx utf-8 printstream javafx-textarea