2014-04-13 40 views
6

Nel seguente codice ho un campo di testo e un pulsante. Devo disabilitare il pulsante quando il campo di testo è vuoto, così posso evitare di inserire valori vuoti nel database. Come posso disabilitare il pulsante?Come disabilitare Button quando TextField è vuoto?

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; 

} 

risposta

13

L'altro modo può essere utilizzato binding:

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

Se vuoi che il pulsante sia disabilitato fino a quando tutti i campi di testo sono compilati devi usare || invece di && – madmax

+0

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

4

uso textProperty() Listener per TextField

provare questo ...

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

Supponiamo di avere 3 campi di testo e un pulsante. Allora come dovrei modificare il codice sopra? – TomJ

+0

@Tom Controlla gli aggiornamenti –

+0

Waht è 't1'? Non ho usato 't1' da nessuna parte nel mio codice e sorprendentemente non mostra alcun errore. – TomJ

15

Simile alla risposta di Uluk, ma usando le associazioni API fluente:

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

Si noti inoltre che, questo nuovo metodo di overload di Bindings viene aggiunto in JavaFX-8 e non Disponibile in JavaFX-2.

+0

Buona risposta ma i tuoi ultimi due binding hanno abbastanza parentesi finali. Ho provato a modificare la risposta, ma non me lo permetteva. – Sedrick

+1

@SedrickJefferson Grazie per aver notato: risolto. –