怎么办TextFieldTableCell的每个按键验证?(How to do per-keystr

2019-09-30 06:16发布

我试图做每个按键验证在一个JavaFX TextFieldTableCell ,但我不知道如何捕捉从嵌入式文本改变事件的 TextField控制。

如果有问题的对象是一个简单的TextField ,然后textField.textProperty().addListener(myChangeListener)会做的伎俩。 TextFieldTableCell也暴露出textProperty()但这个属性的作用完全不同的TextFieldTableCell 。 它不产生在每个键击的基础变化事件。 相反,我看到很多时候事件的TableView首先显示的,我每次看到我开始编辑在小区中的一个事件。

Answer 1:

首先,关于textProperty()。

看看这里看看:

http://docs.oracle.com/javafx/2/api/index.html

TextProperty()是标记父类的属性,你会从中学到什么,因为它不被使用。 这是一件棘手的事情:细胞 - 标记控制的inheritant。 文本字段,你看,当开始编辑,它是细胞的图形节点(graphicProperty())(据我记得文档)。

而且,这个图形节点由一个文本字段赋值,编辑开始,只有当。

据我所知,有一个可编辑的节点没有直接联系。

的方式来解决这个问题 - 用你的自我实现可编辑单元。

让我跟开发商,以了解更多...

假如,你的DataItem类,它包含字符串,并假设的TableView已封装的数据类型DataItem的,唯一的列具有相同封装的数据类型,你可以使用这个实现为基础:

    public class TextFieldTableCell extends TableCell<DataItem, DataItem> {

        private TextField textField;

        public TextFieldTableCell() {
        }

        @Override
        public void startEdit() {
            super.startEdit();
            if (isEmpty()) {
                return;
            }

            if (textField == null) {
                createTextBox();
            } else {
                textField.setText(new CellCustomStringConverter().toString(getItem()));
            }

            setGraphic(textField);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);

            textField.requestFocus();
            textField.selectAll();
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();
            setContentDisplay(ContentDisplay.TEXT_ONLY);
        }

        @Override
        public void updateItem(DataItem item, boolean empty) {
            super.updateItem(item, empty);
            if (!isEmpty()) {
                if (textField != null) {
                    textField.setText(new CellCustomStringConverter().toString(item));
                }
                setText(item.toString());
            }
        }

        private void createTextBox() {
            textField = new TextField(new CellCustomStringConverter().toString(getItem()));
            textField.setId(TABLE_EDIT_ID);
            textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        commitEdit(new DataItem(textField.getText()));
                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });
        }
    }


文章来源: How to do per-keystroke validation of TextFieldTableCell?