引き続き同じ問題があり、メインアプリコードのソースが変更されました: http://Pastebin.com/fLCwuMVq
UIをブロックするCoreTest
に何かがある必要がありますが、それはあらゆる種類のもの(非同期xmlrpcリクエスト、非同期httpリクエスト、ファイルioなど)を実行しているので、runLater
にすべてを入れてみましたが、それは役に立たない。
コードが実行され、出力が正しく生成されることを確認しましたが、UIコンポーネントは何年もの間表示することができません
修正しました。理由はわかりませんが、JavaFXに関するガイドではこれを述べておらず、非常に重要です。
常にJava FX threadとは別のスレッドにプログラムロジックを配置します)
私はこれをSwingのJTextArea
で動作させていましたが、何らかの理由でJavaFXでは動作しません。
私はデバッグしてそれを試し、各書き込みが適切に書き込まれたように見える文字を返すたびに.getText()
を実行しましたが、GUIの実際のTextArea
にはテキストが表示されません。
どういうわけかそれをリフレッシュするのを忘れていましたか?
TextArea ta = TextAreaBuilder.create()
.prefWidth(800)
.prefHeight(600)
.wrapText(true)
.build();
Console console = new Console(ta);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);
Scene app = new Scene(ta);
primaryStage.setScene(app);
primaryStage.show();
そしてConsole
クラス:
import Java.io.IOException;
import Java.io.OutputStream;
import javafx.scene.control.TextArea;
public class Console extends OutputStream
{
private TextArea output;
public Console(TextArea ta)
{
this.output = ta;
}
@Override
public void write(int i) throws IOException
{
output.appendText(String.valueOf((char) i));
}
}
注:これは この答え のソリューションに基づいています、私は気にしていないが変更されていないビットを削除しました(SwingからJavaFXへの変更は別として)、同じ結果が得られました:データがUI要素。画面にデータは表示されません。
UIスレッドで実行してみましたか?
public void write(final int i) throws IOException {
Platform.runLater(new Runnable() {
public void run() {
output.appendText(String.valueOf((char) i));
}
});
}
[〜#〜]編集[〜#〜]
あなたの問題は、GUIスレッドでいくつかの長いタスクを実行すると、完了するまですべてがフリーズすることです。わからない
CoreTest t = new CoreTest(installPath);
t.perform();
ただし、数秒かかる場合、GUIはその数秒間更新されません。これらのタスクは別のスレッドで実行する必要があります。
記録として、これは正常に動作します(ファイルとCoreTestビットを削除しました)。
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
TextArea ta = TextAreaBuilder.create().prefWidth(800).prefHeight(600).wrapText(true).build();
Console console = new Console(ta);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);
Scene app = new Scene(ta);
primaryStage.setScene(app);
primaryStage.show();
for (char c : "some text".toCharArray()) {
console.write(c);
}
ps.close();
}
public static void main(String[] args) {
launch(args);
}
public static class Console extends OutputStream {
private TextArea output;
public Console(TextArea ta) {
this.output = ta;
}
@Override
public void write(int i) throws IOException {
output.appendText(String.valueOf((char) i));
}
}
}