2014-04-13 18 views
6

Trong đoạn mã sau, tôi có một TextField và một Button. Tôi cần phải vô hiệu hóa Button khi bao giờ TextField rỗng, để tôi có thể tránh việc nhập các giá trị rỗng vào cơ sở dữ liệu. Làm thế nào tôi có thể làm cho nút bị vô hiệu hóa?Làm thế nào để vô hiệu hóa Button khi TextField rỗng?

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; 

} 

Trả lời

13

Một cách khác có thể được sử dụng bindings:

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

Nếu bạn muốn nút bị vô hiệu hóa cho đến khi tất cả các trường văn bản được điền vào, bạn nên sử dụng || thay vì && – madmax

+0

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

4

sử dụng textProperty() Listener cho TextField

thử này ...

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

Giả sử tôi có 3 TextFields và một Button. Sau đó, tôi nên chỉnh sửa mã ở trên như thế nào? – TomJ

+0

@Tom Kiểm tra cập nhật –

+0

Waht là 't1'? Tôi không sử dụng 't1' bất cứ nơi nào trong mã của tôi và đáng ngạc nhiên nó cho thấy không có lỗi. – TomJ

15

Tương tự như câu trả lời Uluk, nhưng sử dụng Bindings API thạo:

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

Cũng lưu ý rằng, phương pháp này quá tải mới của Bindings được thêm vào trong JavaFX-8 và không có sẵn trong JavaFX-2.

+0

Câu trả lời hay nhưng hai Bind cuối cùng của bạn có đủ dấu ngoặc kết thúc. Tôi đã cố gắng chỉnh sửa câu trả lời, nhưng nó sẽ không cho tôi. – Sedrick

+1

@SedrickJefferson Cảm ơn bạn đã chú ý: đã sửa. –

Các vấn đề liên quan