Javafx 2 JavaFX:如何在特定时间内禁用按钮?
我想在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&
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();
}