收听JavaFX中是否禁用或启用了按钮
我想要一个允许我监听收听JavaFX中是否禁用或启用了按钮,javafx,Javafx,我想要一个允许我监听TextField组件上的任何更改的代码,用于禁用或启用名为save的按钮。是否可以使用绑定或类似的方法来实现这一点 例如:save.disableProperty().bind(…) 我使用了两个TextField组件来更改TableView中存储的信息 我使用了数据绑定,因此当选择了TableView行时,该行中的信息将显示在TextField中 @FXML private TableView<UserData> table; @FXML private Ta
TextField
组件上的任何更改的代码,用于禁用或启用名为save
的按钮。是否可以使用绑定或类似的方法来实现这一点
例如:save.disableProperty().bind(…)
我使用了两个TextField
组件来更改TableView
中存储的信息我使用了数据绑定,因此当选择了
TableView
行时,该行中的信息将显示在TextField
中
@FXML
private TableView<UserData> table;
@FXML
private TableColumn<UserData, String> col1;
@FXML
private TableColumn<UserData, String> col2;
@FXML
private TextField name;
@FXML
private TextField email;
@FXML
Button newUser;
@FXML
Button save;
@FXML
Button delete;
private Connection conn;
private Statement stm;
private PreparedStatement prep;
private ResultSet result;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
populateTableView();
configureDisable();
table.getSelectionModel().selectedItemProperty().addListener(userDataListener);
name.disableProperty().bind(table.getSelectionModel().selectedItemProperty().isNull());
email.disableProperty().bind(table.getSelectionModel().selectedItemProperty().isNull());
delete.disableProperty().bind(table.getSelectionModel().selectedItemProperty().isNull());
data.addListener((Change<? extends UserData> change) -> save.setDisable(false));
name.setOnAction(ev -> email.requestFocus());
}
private final ChangeListener<UserData> userDataListener = ((v, oldV, newV) -> {
if (oldV != null) {
name.textProperty().unbindBidirectional(oldV.nameProperty());
email.textProperty().unbindBidirectional(oldV.emailProperty());
}
if (newV != null) {
name.textProperty().bindBidirectional(newV.nameProperty());
email.textProperty().bindBidirectional(newV.emailProperty());
}
private void populateTableView() {
try {
conn = CreateConnection.getConnection();
stm = conn.createStatement();
data = FXCollections.observableArrayList();
result = conn.createStatement().executeQuery("select *from user");
while (result.next()) {
data.add(new UserData(result.getString("Name"), result.getString("Email")));
}
col1.setCellValueFactory(new PropertyValueFactory<UserData, String>("name"));
col2.setCellValueFactory(new PropertyValueFactory<UserData, String>("email"));
table.setItems(data);
} catch (IOException ex) {
Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
@FXML
私有表视图表;
@FXML
私有表列col1;
@FXML
私有表列col2;
@FXML
私有文本字段名;
@FXML
私人文本域电子邮件;
@FXML
按钮新建用户;
@FXML
按钮保存;
@FXML
按钮删除;
专用连接连接器;
非公开声明stm;
私人编制报表;
私有结果集结果;
/**
*初始化控制器类。
*/
@凌驾
公共void初始化(URL、ResourceBundle rb){
populateTableView();
configureDisable();
table.getSelectionModel().SelectEditeProperty().addListener(userDataListener);
name.disableProperty().bind(table.getSelectionModel().SelectEditeProperty().isNull());
email.disableProperty().bind(table.getSelectionModel().SelectEditeProperty().isNull());
delete.disableProperty().bind(table.getSelectionModel().SelectEditeProperty().isNull());
data.addListener((更改如果我理解正确,您正在使用文本字段更改表中的数据(特别是这里的名称
和电子邮件
属性),当更改表中的这些值时,您希望启用保存按钮
您可能需要侦听器(而不是绑定)来执行此操作。一种方法是从表项中创建一个ObservableList
,该表项具有用于提取感兴趣的属性的属性。当列表更改时(包括来自任何列表元素的属性),请将“保存”按钮的“禁用”属性设置为false
比如:
ObservableList<UserData> observableData = FXCollections.observableList(table.getItems(),
user -> new Observable[] {user.nameProperty(), user.emailProperty()});
observableData.addListener((Change<? extends Person> change) -> save.setDisable(false));
ObservableList observableData=FXCollections.ObservableList(table.getItems(),
用户->新可观察[]{user.nameProperty(),user.emailProperty()});
observableData.addListener((更改)此答案针对您的特定用例;对于更通用的方法,您可能会对我通过添加以下行来更改代码感兴趣:data.addListener((更改)您是否更改了数据的创建,以便它使用提取器(将项映射到要观察的属性数组的函数),如答案中的代码中所示?这是不必要的,因为我对所有属性都感兴趣。但是,我尝试了,但得到了相同的结果。但是当我在循环“while(result.next()){data.add(new UserData)(result.getString(“Name”),result.getString(”电子邮件“));}”,它会提供所需的结果。不,如果希望列表在属性更改时无效,则需要提取器。然后,当属性更改时,将调用列表上的侦听器,禁用按钮。如果没有提取器,则仅在添加或从列表中删除元素时才调用侦听器。这些参数很小,但请解释原因是的。由于populateTableView
@KarlRichter的声明,代码无法编译。您必须向我显示编译错误。您的代码已经不可编译。我假设它是类的内容,但我在使其可编译方面做了太多推测。可编译代码需要在类内。