【发布时间】:2018-08-28 14:27:34
【问题描述】:
我在 JavaFX 8 中使用自定义 TextFieldTableCell 来允许用户编辑文本字段。但是,当用户按 Enter 键时,我想检查文本字段是否等于某个值。如果它确实等于这个特定值,我不希望保存条目并将其恢复为用户开始编辑之前的文本。有没有我可以覆盖的方法来产生这个结果?我找不到适合我正在寻找的东西。
提前谢谢你!
【问题讨论】:
我在 JavaFX 8 中使用自定义 TextFieldTableCell 来允许用户编辑文本字段。但是,当用户按 Enter 键时,我想检查文本字段是否等于某个值。如果它确实等于这个特定值,我不希望保存条目并将其恢复为用户开始编辑之前的文本。有没有我可以覆盖的方法来产生这个结果?我找不到适合我正在寻找的东西。
提前谢谢你!
【问题讨论】:
由于模型绑定到单元格的数据,您可以在 modell 类中进行验证和重置部分,在您的情况下是在 Person 类中。
这是一个简单的例子:
public class Controller implements Initializable {
@FXML
private TableColumn<Model, String> name;
@FXML
private TableView<Model> tableView;
@Override
public void initialize(URL location, ResourceBundle resources) {
name.setCellValueFactory(data -> data.getValue().nameProperty());
name.setCellFactory(cell -> new TextFieldTableCell<>(new StringConverter<String>() {
@Override
public String toString(String object) {
return object;
}
@Override
public String fromString(String string) {
return string;
}
}));
tableView.setEditable(true);
tableView.setItems(FXCollections.observableArrayList(new Model("Test")));
}
private class Model {
private StringProperty name;
ChangeListener<String> nameChangeListener = (observable, oldValue, newValue) -> {
if (!newValue.matches("[A-Z][a-zA-Z]*")) { // a validation example insert your here.
this.name.set(oldValue);
}
};
public Model(String name) {
this.name = new SimpleStringProperty(name);
this.name.addListener(nameChangeListener);
}
public String getName() {
return name.get();
}
public StringProperty nameProperty() {
return name;
}
}
}
【讨论】:
invalidated(),因为我从来没有用过它我不知道在那里做什么;)
invalidated()解决它,这是一个非常好的方法,谢谢您的建议;)正如您昨天所说,我今天也学到了一些东西;)
根据您的描述,我假设您正在谈论表格视图中的可编辑单元格。
如果是这种情况,以下示例应该适合您。您可以使用 .setOnEditCommit() 方法向要检查输入值的列添加事件处理程序。
//Create table
TableView<Person> table = new TableView<Person>();
table.setEditable(true);
//Create column
TableColumn<Person, String> column = new TableColumn<Person, String>("Full Name");
column.setCellValueFactory(new PropertyValueFactory<>("fullName"));
column.setCellFactory(TextFieldTableCell.<Person> forTableColumn());
column.setMinWidth(200);
column.setOnEditCommit(event -> {
//Get entered value
String newFullName = event.getNewValue();
//Get selected position
TablePosition<Person, String> pos = event.getTablePosition();
//Get row of position
int row = pos.getRow();
//Get data from selected row
Person person = event.getTableView().getItems().get(row);
//Check if text equals ...
if (newFullName.equals("Test")) {
person.setFullName(newFullName);
} else {
person.setFullName(event.getOldValue());
table.refresh();
}
});
【讨论】: