간단하지만 충분히 문제가 있습니다.JavaFX TextArea appendText는 초기화에서 작동하지만 다른 곳에서는 작동하지 않습니다.
<TextArea fx:id="output" editable="false" prefHeight="300.0" prefWidth="200.0" text="Output" GridPane.columnSpan="2" GridPane.rowIndex="4" />
@FXML private TextArea output;
...
public void initialize(URL url, ResourceBundle rb) {
output.setText("Test"); //Test appears correctly in output
...
}
@FXML
public void download() {
String outputTemplate = templateField.getText();
String url = urlField.getText();
System.out.println("Downloading from " + url);
try {
Process down = Runtime.getRuntime().exec("youtube-dl -o \"" + outputTemplate + "\" " + url);
BufferedReader reader = new BufferedReader(new InputStreamReader(down.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); //Prints as expected
output.appendText(line + "\n"); //Has no effect
}
} catch (IOException e) {
e.printStackTrace();
}
}
좋은 것입니다 표시 할 텍스트를 얻는 방법에 대한 아이디어, 나는 다른 프로그램에 전에 이런 짓을 한 : 나의 프로그램에서
I는 TextArea
을 정의 그냥 어떤 이유로, 이번에는 캔트가되고있다.
EDIT : 추가로 조정하면 실제로는 결과가 인쇄되지만 Process
이 끝나고 루프를 종료 한 후에 만 인쇄됩니다.
당신은 백그라운드 스레드에서'output'을 수정할 수 없습니다. –
왜 안 되니? 그것은 작동합니다. 아니면 스레드로부터 안전하지 않다는 것을 의미합니까? – gearquicker
스레드로부터 안전하지 않습니다. [Javadocs] (http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html)에서 "라이브 객체 수정은 JavaFX 응용 프로그램 스레드에서 수행해야합니다". 따라서 특정 플랫폼에서 작동하는 동안 일반적으로 작동한다는 보장은 없습니다. –