Проверить, равняется ли TextFieldTableCell что-то при редактировании? - PullRequest
0 голосов
/ 28 августа 2018

Я использую пользовательский TextFieldTableCell в JavaFX 8, чтобы позволить пользователям редактировать текстовое поле. Когда пользователь нажимает Enter, я хочу проверить, равно ли текстовое поле определенному значению. Если оно равно этому определенному значению, я не хочу, чтобы запись сохранялась и возвращалась к тексту, который был до того, как пользователь начал редактирование. Есть ли способ, который я могу переопределить, чтобы получить этот результат? Я не могу найти тот, который соответствует тому, что я ищу.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Поскольку модель привязана к данным ячейки, вы можете выполнить проверку и сброс детали в классе 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;
        }

    }

}
0 голосов
/ 28 августа 2018

Из вашего описания я предполагаю, что вы говорите о редактируемой ячейке в табличном представлении.

Если это так, то следующий пример должен работать для вас. Вы можете использовать метод .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();
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...