Javafx 2 JavaFX:如何在特定时间内禁用按钮?

Javafx 2 JavaFX:如何在特定时间内禁用按钮?,javafx-2,Javafx 2,我想在JavaFX应用程序中禁用一个特定时间的按钮。有没有这样做的选择?如果没有,是否有解决方案 下面是我在应用程序中的代码。我尝试了Thread.sleep,但我知道这不是阻止用户单击“下一步”按钮的好方法 nextButton.setDisable(true); final Timeline animation = new Timeline( new KeyFrame(Duration.seconds(delayTime), new EventHandler&

我想在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();
nextButton.setDisable(true);
最终时间线动画=新时间线(
新关键帧(持续时间秒(延迟时间),
新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent ActionEvent){
nextButton.setDisable(false);
}
}));
动画。setCycleCount(1);
动画。播放();

禁用JavaFX控件的方法是:

myButton.setDisable(true);
您可以按照自己的意愿以编程方式实现时间逻辑,可以通过轮询计时器,也可以通过调用此方法来响应某个事件

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


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

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


这可能不是实现它的最整洁的方式,但工作安全。

您也可以使用
时间线:

  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();
final Button myButton=新按钮(“等待”+delayTime+“秒”);
myButton.setDisable(true);
最终时间线动画=新时间线(
新关键帧(持续时间秒(延迟时间),
新的EventHandler(){
@重写公共无效句柄(ActionEvent ActionEvent){
myButton.setDisable(false);
}
}));
动画。setCycleCount(1);
动画。播放();

或者您可以使用服务并将running属性绑定到要禁用的按钮的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();
}
public void start(Stage)引发异常{
VBox VBox=新的VBox(10.0);
vbox.setAlignment(位置中心);
最终按钮=新按钮(“您的按钮名称”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
服务=新服务(){
@凌驾
受保护的任务createTask(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
Thread.sleep(5000);//等待时间
返回null;
}
};
}
};
button.disableProperty().bind(service.runningProperty());
service.start();
}
});     
vbox.getChildren().addAll(按钮);
场景=新场景(vbox,300300);
舞台场景;
stage.show();
}

但是Uluk Biy给出的时间线解决方案看起来更优雅。

我已经使用了myButton.setDisable(true);它可以工作,但我将如何应用时间逻辑。我尝试了Thread.sleep,但整个应用程序在那个特定时间挂起。您能提供一个小例子吗?很快我会更新有问题的代码。嗨,Uluk,它在我的代码中不起作用。请参阅更新的问题,我在代码中所做的更改不起作用。它是否引发异常?尝试交换nextButton.setDisable(false)和nextButton.setDisable(true)行。它不会引发任何异常。按照您的建议更改代码后,按钮不会被禁用。
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();
}