Я хочу перенаправить вывод в консоли в JavaFX TextArea, и я следую предложению здесь: JavaFX: перенаправить вывод консоли в TextArea, созданный в Конструктор сцен
Я попытался установить кодировку UTF-8 в PrintStream(), но выглядит не очень< /а>. Установка кодировки в 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));
}
}
}
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. Пожалуйста, простите мое невежество.
Каждое предложение приветствуется.
textArea.setFont(new Font("TimesRoman", 14));
в initialize() в контроллере, но все равно получаю тот же результат. Какие еще шрифты следует использовать? - person Ha Trung Nam Hai   schedule 22.12.2020String.valueOf((char) b)
может быть проблемой.b
— это один байт (значение от 0 до 255). Все же некоторые символы в UTF-8 представлены несколькими байтами, если я не ошибаюсь. - person Slaw   schedule 22.12.2020setText(...)
напрямую с вашим строковым литералом работает нормально (по крайней мере, когда исходный файл скомпилирован с-encoding UTF-8
). - person Slaw   schedule 22.12.2020setText(...)
для отправки вывода консоли в TextArea? Может быть, поместить вывод консоли в строку (или что-то еще?), а затем setText()? - person Ha Trung Nam Hai   schedule 22.12.2020setText
решает проблему. Когда я говорю, что код работает сsetText
, дело в том, что проблема не вTextArea
, а в том, как вы декодируете байты в символы. Я добавил ответ с примером. - person Slaw   schedule 22.12.2020