web-dev-qa-db-ja.com

JavaFXでSystem.outをTextAreaにリダイレクトする

更新:

引き続き同じ問題があり、メインアプリコードのソースが変更されました: http://Pastebin.com/fLCwuMVq

UIをブロックするCoreTestに何かがある必要がありますが、それはあらゆる種類のもの(非同期xmlrpcリクエスト、非同期httpリクエスト、ファイルioなど)を実行しているので、runLaterにすべてを入れてみましたが、それは役に立たない。

アップデート2:

コードが実行され、出力が正しく生成されることを確認しましたが、UIコンポーネントは何年もの間表示することができません

更新3:

修正しました。理由はわかりませんが、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要素。画面にデータは表示されません。

17
Dreen

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));
        }
    }
}
19
assylias