首页 文章

JavaFX TableView单元格编辑器

提问于
浏览
3

我已经在JavaFX TableView教程中实现了类似于Example 12-11 Alternative Solution Of Cell Editing的单元编辑器Example 12-11 Alternative Solution Of Cell Editing(我正在描述的问题可以复制,使用该示例作为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());
        }
    }
});

我发现焦点是暂时给予 TableViewVirtualFlow 然后又快速回到 TextEdit (不知道为什么会发生这种焦点变化,也可以自由地说明这一点) . 这比UI更新发生得更快,因此用户将无法体验这种快速焦点更改 . 不幸的是,变革听众会......

How can I create a cell editor that does not have this issue?

要求:

  • 我需要让编辑器在"real"焦点更改时提交值(即在编辑器外单击)

  • 编辑器内的点击必须传播到 TextEdit 以允许文本选择,移动插入符号等 .

  • 它应该适用于Java 7和JavaFX 2.2

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

1 回答

  • 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();
                        }
                }
    

相关问题