¿Cómo deshabilitar el botón cuando TextField está vacío?

En el siguiente código, tengo un TextField y un botón. Necesito desactivar el botón cuando el campo de texto esté vacío, de modo que pueda evitar ingresar valores vacíos a la base de datos. ¿Cómo puedo desactivar el botón?

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("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() { @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; } 

La otra manera puede ser usar enlaces:

 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); 

Similar a la respuesta de Uluk, pero usando la API fluida Bindings:

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

También tenga en cuenta que este nuevo método de Bindings sobrecargado se agrega en JavaFX-8 y no está disponible en JavaFX-2.

use textProperty() Oyente para TextField

prueba esto…

 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() { @Override public void changed(ObservableValue ov, String t, String t1) { //System.out.println(t+"====="+t1); if(t1.equals("")) b1.setDisable(true); else b1.setDisable(false); } });