18

アップデート:

まだ同じ問題があり、メイン アプリ コードのソースが改訂されています: http://pastebin.com/fLCwuMVq

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

更新 2:

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

更新 3:

OK私はそれを修正しました。理由はわかりませんが、JavaFX に関するガイドでこれを述べたものはなく、非常に重要です。

プログラム ロジックは、常に Java FX スレッドとは別のスレッドに配置します。


私はこれを Swing で動作JTextAreaさせましたが、何らかの理由で JavaFX では動作しません。

私はデバッグを試み.getText()ましたが、各書き込み後に適切に書き込まれた文字のように見えるものを返しましたが、実際TextAreaの G​​UI にはテキストが表示されません。

どういうわけかそれを更新するのを忘れましたか?

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要素にデータが書き込まれ、データが表示されませんスクリーン。

4

1 に答える 1

19

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));
        }
    }
}
于 2012-12-12T14:34:47.943 に答える