我正在测试JavaFX 2.1并尝试使用可编辑的表视图来按照我希望的方式运行。
我使用JavaFX 2文档中的示例作为基础:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm
该示例有两个问题:
另一方面,一个功能正常的功能是,我可以选择文本,并使用鼠标将插入符号重新定位在TextField中多次。
这里有两个问题,分别涉及这两个问题:
Java FX 2 Table Cell Editing and Focus
和
当第一个问题的答案自己应用时,我只需要点击一次来编辑单元格(在选择行之后),我仍然可以选择文本并移动插入符号。
当第二个问题的答案自己应用时,编辑在没有按下回车键的情况下提交,但是我只能重新定位插入符号或选择一次文本,如果我再次尝试,那么编辑已提交。
当我同时应用两个答案时,成功应用焦点并在单击鼠标时提交编辑,但我无法重新定位插入符号或完全选择文本。单元格内的任何鼠标单击都会提交编辑。
我的问题是如何解决原始的2个问题而不会失去定位插入符和选择文本的能力?
答案 0 :(得分:1)
尝试使用jkaufmann的示例应用程序回答他自己的问题TableView - Better Editing through Binding?他的绑定解决方案和TableView编辑语义的实现似乎足以解决您在问题中提出的所有问题。
答案 1 :(得分:1)
您需要本着JavaFX框架的精神在正确的时间修改GUI组件。即在控件layoutChildren方法中。您需要覆盖自定义TableCell的layoutChildren方法,然后设置光标位置,例如
TextField textField = new TextField() {
private boolean first = true;
@Override protected void layoutChildren() {
super.layoutChildren();
// Set cursor caret at end of text (and clear highlighting)
if (first) {
this.end();
first = false;
}
}
};
我还注意到Java 1.8.0_241在TextFieldTableCell实现中也包含此问题。更糟糕的是,TextField完全不属于TextFieldTableCell实现,因此,为了解决该问题,我选择复制javax.scene.table.cell.TextFieldTableCell和javax.scene.table.cell.CellUtils的源。 TextField在CellUtils中实例化,因此您可以将光标定位在该位置。例如
static <T> TextField createTextField(final Cell<T> cell, final StringConverter<T> converter) {
final TextField textField = new TextField(getItemText(cell, converter)) {
private boolean first = true;
@Override protected void layoutChildren() {
super.layoutChildren();
// Set cursor caret at end of text (and clear highlighting)
if (first) {
this.end();
first = false;
}
};
...
...
}