JavaFX TableView单元格编辑器

时间:2014-01-30 13:30:41

标签: javafx javafx-2

我已经在JavaFX TableView教程的Example 12-11 Alternative Solution Of Cell Editing中实现了类似于EditingCell的单元格编辑器(我正在描述的问题可以复制,使用该示例作为SSCCE)。

然而,它伴随着一个非常烦人的错误,那就是用作编辑器的TextEdit控件内的每次鼠标点击(用于移动插入符号或选择文本)都会导致焦点更改,然后提交并结束编辑。

负责提交的代码:

textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
    @Override
    public void changed(ObservableValue<? extends Boolean> arg0,
                        Boolean arg1, Boolean arg2) {
        if (!arg2) {
            commitEdit(textField.getText());
        }
    }
});

我已经花了好几个小时用调试器和阅读源代码来查看这些内容,并且我发现焦点是临时的TableView的{​​{1}},然后快速返回再次VirtualFlow(不确定为什么这种焦点变化发生,请随时对此进行阐述)。这比UI更新发生得更快,因此用户将无法体验这种快速焦点更改。不幸的是,变革听众会......

如何创建没有此问题的单元格编辑器?

要求:

  • 我需要让编辑器提交关于“真实”焦点变化的值(即在编辑器外点击)
  • 编辑器内的点击必须传播到TextEdit以允许文本选择,移动插入符等。
  • 它应该适用于Java 7和JavaFX 2.2

PS:this blog post(及其update)中提到的解决方案显示了完全相同的问题。

1 个答案:

答案 0 :(得分:1)

此问题在1.8b123中已修复。

如果你需要它在FX 2.2中工作,试试这个超级丑陋的黑客:

            public void changed(ObservableValue<? extends Boolean> arg0, 
                Boolean arg1, Boolean arg2) {
                    if (!arg2) {
                        final PauseTransition wait = new PauseTransition(Duration.millis(20));
                        wait.setOnFinished(new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent event) {
                                if (! textField.isFocused()) {
                                    commitEdit(textField.getText());          
                                }
                            }
                        });
                        wait.play();
                    }
            }