問題は単純ですが、それは私を狂ってしまっています。JavaFX TextArea appendTextは初期化では動作しますが、他の場所では動作しません。
私はTextArea
、と定義している私のプログラムで
:テキストを表示するために取得する方法上の任意のアイデアは素晴らしいことだ
<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();
}
}
、私は別のプログラムに前にこれをやりましたちょうど何らかの理由で、今度はカンタンです。
EDIT:実際には、が終了してループを終了した後に結果を出力します。
あなたは 'バックグラウンドスレッドからoutput'を変更することはできません。 –
どうしてですか?できます。それともスレッドセーフではないということですか? – gearquicker
スレッドセーフではありません。 [Javadocs](http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html)から、「JavaFXアプリケーション・スレッドでライブ・オブジェクトの変更を行う必要があります。したがって、特定のプラットフォームで動作する可能性がありますが、一般的には動作する保証はありません。 –