2014-04-13 16 views
6

Im folgenden Code habe ich ein TextField und einen Button. Ich muss die Schaltfläche deaktivieren, wenn das TextField leer ist, so dass ich vermeiden kann, leere Werte in die Datenbank einzugeben. Wie kann ich die Schaltfläche deaktivieren?Wie Button zu deaktivieren, wenn TextField leer ist?

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; 

} 

Antwort

13

Die andere Möglichkeit, Bindungen, lassen sich mit:

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

Wenn Sie möchten, dass die Schaltfläche deaktiviert wird, bis alle Textfelder ausgefüllt sind, sollten Sie || verwenden anstelle von && – madmax

+0

http://stackoverflow.com/questions/23194183/disabling-button-while-textfields-e-pty-not-working – madmax

4

Verwendung textProperty() Listener für TextField

versuchen, diese ...

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); 
     } 
    }); 
+0

Angenommen, ich habe 3 TextFields und einen Button. Wie soll ich dann den obigen Code bearbeiten? – TomJ

+0

@Tom Updates überprüfen –

+0

Waht ist 't1'? Ich habe 't1' nirgendwo in meinem Code verwendet und erstaunlicherweise zeigt es keinen Fehler. – TomJ

15

ähnlich uluk Antwort, aber die Bindungen fließend API:

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

Beachten Sie auch, dass diese neue überladene Methode von Bindings in JavaFX-8 hinzugefügt wird und nicht in JavaFX-2 avaliable.

+0

Gute Antwort, aber Ihre letzten beiden Bindungen haben genug endende Klammern. Ich habe versucht, die Antwort zu bearbeiten, aber es ließ mich nicht. – Sedrick

+1

@SedrickJefferson Danke für die Aufmerksamkeit: behoben. –

Verwandte Themen