如何在处理时禁用按钮

时间:2014-09-09 13:38:54

标签: 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();

2 个答案:

答案 0 :(得分:1)

根据您发布的代码,在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不会给你那么讨厌&#39;应用程序已经停止响应&#39;业务),然后在线程内部,只要你想在GUI上改变某些东西,使用Platform.runLater()语法,从技术上讲,你正在制作一个新的&#39; Runnable&#39; runLater方法中的对象,但是由于lambda表达式,你不必担心!如果您不使用Platform.runLater(),那么您将无法获得Javafx应用程序线程&#39;尝试更新内容时出现异常。

另外值得注意的是,我认为在javafx 2. *(java 7)它的btn.setEnable(false)而不是btn.setDisable(true)只是改变了它们的方式。同样的效果。

答案 1 :(得分:0)

使用f.f.g代码

btn.setEnabled(false);

在handle方法中,然后:

btn.setEnabled(true);