检查TextFieldTableCell是否等于编辑提交时的值?

时间:2018-08-28 14:27:35

标签: java javafx java-8

我正在JavaFX 8中使用自定义TextFieldTableCell,以允许用户编辑文本字段。但是,当用户按下Enter键时,我要检查文本字段是否等于某个值。如果它确实等于该特定值,则我不想保存该条目并将其还原为用户开始编辑之前的文本。有没有一种我可以重写以产生此结果的方法?我找不到适合我想要的东西。

提前谢谢!

2 个答案:

答案 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();
        }
    });