java - 如何在处理时禁用按钮

标签 java javafx

如何在处理某些内容时禁用 JavaFX 按钮(以防止用户向按钮发送垃圾邮件)?

primaryStage.setTitle("Update Stuff");

Label lbl = new Label();
lbl.setText("Nothing here yet");

Button btn = new Button();
btn.setText("Update");
btn.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        btn.setDisable(true); //I tried this, but to no avail
        lbl.setText(getNumberOfViewers()); // this might take a few seconds, need to disable button during this time
        btn.setDisable(false);
    }
});

VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(btn, lbl);
primaryStage.setScene(new Scene(root, 200, 100));
primaryStage.show();

最佳答案

根据您发布的代码,在 javafx 8 中将是这样的:

primaryStage.setTitle("Update Stuff");

Label lbl = new Label();
lbl.setText("Nothing here yet");

Button btn = new Button();
btn.setText("Update");
btn.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        btn.setDisable(true);
        new Thread(()->{
            final String numberOfViews =  getNumberOfViewers();
            Platform.runLater(()->{
                lbl.setText(numberOfViews);
                btn.setDisable(false);
            });                   
        }).start();
        lbl.setText(getNumberOfViewers()); // this might take a few seconds, need to disable button during this time
    }
});

VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(btn, lbl);
primaryStage.setScene(new Scene(root, 200, 100));
primaryStage.show();

新线程将使 UI 线程永远不会被真正阻塞(Windows 不会给你带来令人讨厌的“应用程序已停止响应”业务),然后在线程内,任何时候你想在 GUI 上更改某些内容,请使用 Platform.runLater() 语法,从技术上讲,你正在 runLater 方法内创建一个新的“Runnable”对象,但由于 lambda 表达式,你无需担心这一点!如果您不使用 Platform.runLater(),当您尝试更新内容时,您将收到“不在 Javafx 应用程序线程上”异常。

还值得注意的是,我认为在 javafx 2.* (java 7) 中,它是 btn.setEnable(false) 而不是 btn.setDisable(true) 只是他们的处理方式发生了变化。效果相同。

关于java - 如何在处理时禁用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746142/

相关文章:

java - 一旦你猜对了数字,如何让这个猜数字游戏重新开始?

java - JDialog空闲时超时

java - 使用 Mockito 和 JUnit 进行测试时的奇怪行为

java - OpenSessionInViewFilter 无法转换为 javax.servlet.Filter

javafx - 如何在javafx中更改treeitem展开和折叠箭头的颜色?

java - 静态方法和继承的返回类型中的泛型

JavaFX 在两台显示器上全屏显示应用程序

JavaFX 文本拉伸(stretch)舞台宽度

javafx焦点窗口

javafx - 未选中复选框时如何停止转换javafx