我想将console中的输出重定向到javafx textarea,并遵循以下建议:javafx:redirect console output to textarea that is created in scenebuilder
我试图在printstream()中将charset设置为utf-8,但看起来不太好。将字符集设置为utf-16有一点改进,但仍然难以辨认。
在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.
控制器.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));
}
}
}
用户界面.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);
}
}
示例.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的工作原理并不熟悉。请原谅我的无知。
感谢您的建议。
2条答案
按热度按时间cclgggtu1#
尝试将默认的jvm编码设置为utf-8。
有关更多详细信息,请参阅以下线程:设置默认java字符编码
如果不想导出文件,请进入eclipse preferences>general>工作区,将文本文件编码设置为utf-8(或者您希望的编码)。
还有一些细节:如何在eclipse中更改默认文本文件编码
wz1wpwve2#
我相信您的问题是由以下代码引起的:
这是将每个字节转换成一个字符。换句话说,假设每个字符由一个字节表示。这不一定是真的。一些编码,如utf-8,可能使用多个字节来表示单个字符。如果他们想表示超过256个字符,就必须这样做。
您需要正确解码传入的字节。与其自己动手,不如找个方法来使用
BufferedReader
. 幸运的是,这是可能的PipedInputStream
以及PipedOutputStream
. 例如:使用
buffer
上面是一个避免用任务淹没javafx应用程序线程的尝试。您需要考虑的其他事项:
因为您使用的是字符串文字,所以请确保您既使用utf-8保存源文件,又使用utf-8编译代码
-encoding UTF-8
.确保您使用的字体与
TextArea
可以代表所有你想要的字符。您可能还需要使用
-Dfile.encoding=UTF-8
但我不确定。我没有,它仍然对我有效。