JavaFXのアプリケーションでのThread.sleep()の使用

ダンフイ:

私はボタンを示してアプリケーションを作成してみてください。私はボタンをクリックすると、シーンは数秒間(ラベルを追加)、いくつかのテキストを表示する必要があり、その後、テキストは(シーンからラベルを削除する)消えるはずです。しかし、実際には、私はボタンをクリックすると、何も起こりません。

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        StackPane pane = new StackPane();
        Button btn = new Button();
        Label lb = new Label("Start");
        pane.getChildren().addAll(btn);
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(pane, 300, 275));
        primaryStage.show();
        btn.setOnAction(e->{
             pane.getChildren().addAll(lb);
            try {
                Thread.sleep(300);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
           pane.getChildren().removeAll(lb);
        });
    }
    public static void main(String[] args) {
        launch(args);
    }
}
James_D:

使用PauseTransition

btn.setOnAction(e->{
    pane.getChildren().addAll(lb);
    PauseTransition pause = new PauseTransition(Duration.seconds(0.3));
    pause.setOnFinished(e -> pane.getChildren().removeAll(lb));
    pause.play();
});

あなたのアプローチは、動作しない理由は、JavaFXのが効果的にレンダリングし、ユーザーイベントを処理するための単一のスレッドを使用することです。これは、固定された間隔(現在の実装では、毎秒60回)で画面を更新するが、同期の理由から、現在完全最初に処理されている保留中のイベントを待たなければならないであろう。あなたのオリジナルコードラベルを追加して、0.3秒間停止した後、ラベルを削除します。FXフレームワークは決してそれが起こっている間にシーンを再描画する機会を持っていないので、FXのアプリケーションスレッドは、このプロセス全体のために占有されています。

ここでは一番下の行は、あなたが呼び出すことで、FXアプリケーションスレッドをブロックすることはありませんということですsleep()か長時間実行操作を実行することによって。

コメントで追加の質問に応じて更新します。

すべてのイベント処理を無効にするには、呼び出すことができsetDisable(true)、シーンのルートノードに。ラベルが示されているので、イベント処理を防ぐために:

btn.setOnAction(e->{
    pane.getChildren().addAll(lb);
    pane.setDisable(true);
    PauseTransition pause = new PauseTransition(Duration.seconds(0.3));
    pause.setOnFinished(e -> {
        pane.getChildren().removeAll(lb));
        pane.setDisable(false);
    });
    pause.play();
});

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=401084&siteId=1