收听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的声明,代码无法编译。您必须向我显示编译错误。您的代码已经不可编译。我假设它是类的内容,但我在使其可编译方面做了太多推测。可编译代码需要在类内。