TextField为空时如何禁用Button?
Posted
技术标签:
【中文标题】TextField为空时如何禁用Button?【英文标题】:How to disable Button when TextField is empty? 【发布时间】: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;
【问题讨论】:
【参考方案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);
【讨论】:
如果您希望在填写所有文本字段之前禁用该按钮,您应该使用 ||而不是 && ***.com/questions/23194183/… 有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 是文本框中的当前字符串。它是一个字符串变量,根据您的需要更改其名称以上是关于TextField为空时如何禁用Button?的主要内容,如果未能解决你的问题,请参考以下文章