我已经在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
以允许文本选择,移动插入符等。PS:this blog post(及其update)中提到的解决方案显示了完全相同的问题。
答案 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();
}
}