【问题标题】:JavaFX: How to disable a button for a specific amount of time?JavaFX:如何在特定时间内禁用按钮?
【发布时间】:2013-06-04 13:54:09
【问题描述】:

我想在 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();

【问题讨论】:

    标签: javafx-2


    【解决方案1】:

    您可以使用提供相关 GUI 调用的简单线程方法(当然是通过runLater()):

    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();
    

    这可能不是实现它的最佳方式,但可以安全地工作。

    【讨论】:

      【解决方案2】:

      您也可以使用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();
      

      【讨论】:

      • 嗨 Uluk,它在我的代码中不起作用。请参阅更新后的问题,我在代码中所做的更改不起作用。
      • 是否抛出异常?尝试交换行 nextButton.setDisable(false) 和 nextButton.setDisable(true)。
      • 它没有抛出任何异常。根据您的建议更改代码后,按钮不会被禁用。
      【解决方案3】:

      禁用JavaFX控件的方法是:

      myButton.setDisable(true);
      

      您可以通过任何方式以编程方式实现时间逻辑,方法是轮询计时器或调用此方法以响应某个事件。

      如果您在 SceneBuilder 中通过 FXML 创建了此按钮实例,那么您应该为该按钮分配一个 fx:id,以便在加载场景图期间将其引用自动注入到您的控制器对象中。这将使您更容易在控制器代码中使用。

      如果您以编程方式创建了此按钮,那么您的代码中就已经有了它的引用。

      【讨论】:

      • 我已经用过 myButton.setDisable(true);它可以工作,但我将如何为其应用时间逻辑。我当时尝试了 Thread.sleep,但整个应用程序在特定时间挂起。你能提供一个小例子吗?很快我会更新有问题的代码。
      【解决方案4】:

      或者您可以使用服务并将运行属性绑定到您要禁用的按钮的 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给出的Timeline方案,看起来更优雅。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        相关资源
        最近更新 更多