6

JavaFX アプリケーションで特定の時間だけボタンを無効にしたい。これを行うオプションはありますか?そうでない場合、これに対する回避策はありますか?

以下は、アプリケーションの私のコードです。を試してみThread.sleepましたが、ユーザーが次のボタンをクリックするのを止める良い方法ではないことはわかっています。

nextButton.setDisable(true);
final Timeline animation = new Timeline(
        new KeyFrame(Duration.seconds(delayTime),
        new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                nextButton.setDisable(false);
            }
        }));
animation.setCycleCount(1);
animation.play();
4

4 に答える 4

5

次のものを使用することもできますTimeline

  final Button myButton = new Button("Wait for " + delayTime + " seconds.");
  myButton.setDisable(true);

  final Timeline animation = new Timeline(
            new KeyFrame(Duration.seconds(delayTime),
            new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent actionEvent) {
                    myButton.setDisable(false);
                }
            }));
  animation.setCycleCount(1);
  animation.play();
于 2013-06-04T14:49:28.143 に答える
2

JavaFX コントロールを無効にする方法は次のとおりです。

myButton.setDisable(true);

タイマーをポーリングするか、何らかのイベントに応答してこのメ​​ソッドを呼び出すことにより、任意の方法で時間ロジックをプログラムで実装できます。

SceneBuilder で FXML を使用してこのボタン インスタンスを作成した場合は、ボタンに fx:id を割り当てて、シーン グラフのロード中にその参照がコントローラ オブジェクトに自動的に挿入されるようにする必要があります。これにより、コントローラー コードでの作業が容易になります。

このボタンをプログラムで作成した場合は、その参照をコードで使用できます。

于 2013-06-04T13:58:00.040 に答える
0

または、サービスを使用して、実行中のプロパティを無効にするボタンの disableProperty にバインドすることもできます。

public void start(Stage stage) throws Exception {
    VBox vbox = new VBox(10.0);
    vbox.setAlignment(Pos.CENTER);      

    final Button button = new Button("Your Button Name");
    button.setOnAction(new EventHandler<ActionEvent>() {            
        @Override
        public void handle(ActionEvent event) {
            Service<Void> service = new Service<Void>() {                   
                @Override
                protected Task<Void> createTask() {
                    return new Task<Void>() {
                        @Override
                        protected Void call() throws Exception {
                            Thread.sleep(5000);//Waiting time
                            return null;
                        }
                    };
                }
            };
            button.disableProperty().bind(service.runningProperty());               
            service.start();
        }
    });     

    vbox.getChildren().addAll(button);
    Scene scene = new Scene(vbox, 300, 300);
    stage.setScene(scene);
    stage.show();
}

しかし、Uluk Biy によって提供されたタイムライン ソリューションは、よりエレガントに見えます。

于 2013-06-04T15:03:11.593 に答える