我正在JavaFX 8中使用自定义TextFieldTableCell
,以允许用户编辑文本字段。但是,当用户按下Enter键时,我要检查文本字段是否等于某个值。如果它确实等于该特定值,则我不想保存该条目并将其还原为用户开始编辑之前的文本。有没有一种我可以重写以产生此结果的方法?我找不到适合我想要的东西。
提前谢谢!
答案 0 :(得分:0)
由于模型已绑定到单元格的数据,因此您可以在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;
}
}
}
答案 1 :(得分:-1)
根据您的描述,我假设您正在谈论表格视图中的可编辑单元格。
如果是这种情况,下面的示例将为您工作。您可以使用.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();
}
});