从TextFieldTableCell继承时,未调用TableCell focusedProperty侦听器

时间:2014-08-04 09:47:31

标签: javafx-8

我想创建一个返回TableCell的Cell工厂,其行为与TextFieldTableCell完全相同,但有以下区别:当它失去焦点时,它会提交更改。

我的代码非常简单:

public final class TextFieldCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {

    @Override
    public TableCell<S, T> call(TableColumn<S, T> p) {

        class EditingCell extends TextFieldTableCell {

            public EditingCell() {

                super();

                setConverter(new DefaultStringConverter());

                focusedProperty().addListener(new ChangeListener() {

                    @Override
                    public void changed(ObservableValue observable, Object oldValue, Object newValue) {

                        System.out.println("changed!");

                        System.out.println("getText() = " + getText());
                        System.out.println("textProperty() = " + textProperty().get());
                        System.out.println("getItem = " + getItem());
                    }
                });
            }

            @Override
            public void startEdit() {

                super.startEdit();
            }

            @Override
            public void cancelEdit() {

                super.cancelEdit();
            }

        }

        return new EditingCell();
    }
}

如您所见,我在focusedProperty中添加了一个更改侦听器。问题是没有调用更改方法(没有打印)。

我如何获得所需的行为?谢谢。

1 个答案:

答案 0 :(得分:0)

基本上,您必须使用textField(不是单元格)focusedProperty注册监听器。由于textfield是super的私有字段,因此无法直接访问 - 在将其添加到单元格后,您必须查找一次。这是第一次开始编辑时的情况:

private TextField myTextField;

@Override
public void startEdit() {
    super.startEdit();
    if (isEditing() && myTextField == null) {
        // most simple case, assuming that there is no graphic other than the field 
        // TBD: implement the general case: walk the tree and find the field
        myTextField = (TextField) getGraphic();
        myTextField.focusedProperty().addListener((e, old, nvalue) -> {
            if (!nvalue) {
                T edited = getConverter().fromString(myTextField.getText());
                commitEdit(edited);
            }

        });
    }
}

一些注意事项:

  • 这是围绕open issue(投票给它!)
  • 的变通方法
  • 从jdk8开始,它不是entirely functional:如果你点击表格中的其他地方就不会提交
  • a recent answer使用的绑定方法可能会或不会完全正常运行(没有测试)