【问题标题】:Check if TextFieldTableCell equals something on edit commit?检查 TextFieldTableCell 是否等于编辑提交时的内容?
【发布时间】:2018-08-28 14:27:34
【问题描述】:

我在 JavaFX 8 中使用自定义 TextFieldTableCell 来允许用户编辑文本字段。但是,当用户按 Enter 键时,我想检查文本字段是否等于某个值。如果它确实等于这个特定值,我不希望保存条目并将其恢复为用户开始编辑之前的文本。有没有我可以覆盖的方法来产生这个结果?我找不到适合我正在寻找的东西。

提前谢谢你!

【问题讨论】:

    标签: java javafx java-8


    【解决方案1】:

    由于模型绑定到单元格的数据,您可以在 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;
            }
    
        }
    
    }
    

    【讨论】:

    • 是的,让模型保护自己的完整性很好(实际上总是有必要的,它不能依赖外部人员这样做) - 但是如果您使用监听器方法,则无需添加/删除侦听器,前提是您从有效值开始,无论如何这都是必须的;)。另一种选择(我的偏好)是一个自定义属性,它带有一个正在执行验证的被覆盖的无效。
    • 是的,你是对的,我之前得到了 SOException,这就是我添加/删除它的原因,但是在没有它的情况下重新测试之后。我正在更新答案。我想看看你的方法覆盖了invalidated(),因为我从来没有用过它我不知道在那里做什么;)
    • 看看核心类 - 他们经常这样做(不在我的 IDE 上,所以现在不能更具体,抱歉)
    • 我可以使用invalidated()解决它,这是一个非常好的方法,谢谢您的建议;)正如您昨天所说,我今天也学到了一些东西;)
    【解决方案2】:

    根据您的描述,我假设您正在谈论表格视图中的可编辑单元格。

    如果是这种情况,以下示例应该适合您。您可以使用 .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();
            }
        });
    

    【讨论】:

    • 基本上没问题,但是:永远不要(如 99.99999%)使用 table.refresh - 如果看起来有必要,那么很可能您的设置有问题!
    • 您也可以使用 table.getColumns().get(col).setVisible(false) 和之后的 table.getColumns().get( col).setVisible(true);
    • nononono 更糟糕的是......而不是做错事(以任何形式)正确设置您的数据,然后自动更新!
    • 您有什么建议可以正确设置数据?我愿意接受比我更好的解决方案。
    • 如果它不能自动工作,那么你没有显示的代码有问题 - 我的水晶球懒得猜测;)发布一个问题,有人可能会调查你的问题。无论如何,我不明白你为什么需要重置为旧值:此时没有提交任何内容,所以你的数据没有改变。如果这没有反映在单元格中,那么它可能是单元格实现中的错误(其概率非零;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2016-08-13
    相关资源
    最近更新 更多