2013-06-04 13 views
5

JavaFXアプリケーションで特定の時間のボタンを無効にしたいとします。これを行うオプションはありますか?もしそうでなければ、これに対して何か回避策がありますか?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(); 

答えて

5

あなたは(当然のrunLater()を通じて)関連のGUIの通話を提供したスレッドの単純なアプローチを使用することができます

new Thread() { 
    public void run() { 
     Platform.runLater(new Runnable() { 
      public void run() { 
       myButton.setDisable(true); 
      } 
     } 
     try { 
      Thread.sleep(5000); //5 seconds, obviously replace with your chosen time 
     } 
     catch(InterruptedException ex) { 
     } 
     Platform.runLater(new Runnable() { 
      public void run() { 
       myButton.setDisable(false); 
      } 
     } 
    } 
}.start(); 

それはおそらくそれを達成するためのneatest方法はありませんが、安全に動作します。

2

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

myButton.setDisable(true); 

あなたはタイマーポーリングするかに応じて呼び出され、このメソッドを持っていることによってどちらか、あなたが望む任意の方法で、プログラムの時間ロジックを実装することができますいくつかのイベント。

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

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

+0

私はすでにmyButton.setDisable(true)を使用しています。私はその時間のロジックを適用します。私はその時間Thread.sleepを試みたが、アプリケーション全体がその特定の時間のためにハングする。小さな例を提供することはできますか?まもなく私は問題のコードを更新します。 – Rohan

4

また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(); 
+0

こんにちはUluk、私のコードで動作していない。更新された質問を参照してください、私はコードが動作していない変更。 – Rohan

+0

例外が発生していますか? nextButton.setDisable(false)およびnextButton.setDisable(true)の行を入れ替えます。 –

+0

例外をスローしません。提案ボタンごとにコードを変更した後、無効になっていません。 – Rohan

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によって与えられたタイムラインソリューションは、よりエレガントに見えます。

関連する問題