【问题标题】:How to disable Button when TextField is empty?TextField为空时如何禁用Button?
【发布时间】:2014-05-27 06:11:56
【问题描述】:

在下面的代码中,我有一个 TextField 和一个 Button。当 TextField 为空时,我需要禁用 Button,这样我就可以避免向数据库输入空值。如何禁用按钮?

    private VBox addVBox() {

    VBox vb1 = new VBox();
    vb1.setPadding(new Insets(15, 20, 25, 20));
    vb1.setSpacing(15);
    vb1.setStyle("-fx-background-color: #333333;");

    final Label label = new Label("Staff Details");
    label.setFont(Font.font("Arial", FontWeight.BOLD, 20));
    label.setTextFill(Color.WHITE);

    TableColumn sub = new TableColumn("Staff Name");
    sub.setMinWidth(400);
    sub.setCellValueFactory(
            new PropertyValueFactory<Staff, String>("subName"));

    table.setItems(data);
    table.getColumns().addAll(sub);

    addSubName = new TextField();
    addSubName.setPromptText("Staff Name");
    addSubName.setPrefSize(200, 30);

    final Button b2 = new Button("Add");
    b2.setFont(Font.font("Calibri", FontWeight.BOLD, 17));
    b2.setPrefSize(70, 30);
    b2.setStyle(" -fx-base: #0066ff;");
    b2.setTextFill(Color.BLACK);

     b2.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent e) {

            msg = addSubName.getText();
            try {
                enterStaff();
            } catch ( ClassNotFoundException | SQLException ex) {
                Logger.getLogger(AddStaff.class.getName()).log(Level.SEVERE, null, ex);
            }

            data.add(new Staff(addSubName.getText()));
            addSubName.clear();
            }
     });

    hb.getChildren().addAll(addSubName, b2);
    hb.setSpacing(5);

    vb1.getChildren().addAll(label, table, hb);
    return vb1;

}

【问题讨论】:

    标签: button javafx javafx-2 textfield


    【解决方案1】:

    类似于 Uluk 的回答,但使用的是 Bindings fluent API:

    btn.disableProperty().bind(
        Bindings.isEmpty(textField1.textProperty())
        .and(Bindings.isEmpty(textField2.textProperty()))
        .and(Bindings.isEmpty(textField3.textProperty()))
    );
    

    还要注意,Bindings 这个新的重载方法是在 JavaFX-8 中添加的,在 JavaFX-2 中不可用。

    【讨论】:

    • isNumeric 之类的方法isEmpty 吗?为了在文本字段为数字时启用/禁用按钮!
    • @Panagiss 不,你必须自己创建,使用Bindings.createBooleanBinding(...)
    【解决方案2】:

    另一种方法是使用绑定:

    final TextField textField1 = new TextField();
    final TextField textField2 = new TextField();
    final TextField textField3 = new TextField();
    
    BooleanBinding bb = new BooleanBinding() {
        {
            super.bind(textField1.textProperty(),
                    textField2.textProperty(),
                    textField3.textProperty());
        }
    
        @Override
        protected boolean computeValue() {
            return (textField1.getText().isEmpty()
                    && textField2.getText().isEmpty()
                    && textField3.getText().isEmpty());
        }
    };
    
    Button btn = new Button("Button");
    btn.disableProperty().bind(bb);
    
    VBox vBox = new VBox();
    vBox.getChildren().addAll(textField1, textField2, textField3, btn);
    

    【讨论】:

    • 如果您希望在填写所有文本字段之前禁用该按钮,您应该使用 ||而不是 &&
    • isNumeric 之类的方法isEmpty 吗?为了在文本字段为数字时启用/禁用按钮!
    【解决方案3】:

    TextField

    使用 textProperty() 监听器

    试试这个...

    Button b1 = new Button("DELETE");
    b1.setFont(Font.font("Calibri", FontWeight.BOLD, 17));
    b1.setPrefSize(100, 30);
    b1.setStyle(" -fx-base: #ffffff;");
    b1.setTextFill(Color.BLACK);
    
    b1.setDisable(true); // Initally text box was empty so button was disable
    
    txt1.textProperty().addListener(new ChangeListener<String>() {
    
            @Override
            public void changed(ObservableValue<? extends String> ov, String t, String t1) {
                //System.out.println(t+"====="+t1);
               if(t1.equals(""))
                   b1.setDisable(true);
               else
                   b1.setDisable(false);
            }
        });
    

    【讨论】:

    • 假设我有 3 个文本字段和一个按钮。那我应该如何编辑上面的代码呢?
    • 什么是't1'?我没有在我的代码中的任何地方使用“t1”,而且令人惊讶的是它没有显示任何错误。
    • @Tom t1 是文本框中的当前字符串。它是一个字符串变量,根据您的需要更改其名称
    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多