3

我正在测试 JavaFX 2.1 并试图让可编辑的表视图以我希望的方式运行。

我使用 JavaFX 2 文档中的示例作为基础:http ://docs.oracle.com/javafx/2/ui_controls/table-view.htm

该示例有两个问题:

  1. 用户被迫单击单元格 3 次以对其进行编辑,一次选择行,一次选择单元格并使其可编辑,然后进一步单击以聚焦 TextField
  2. 只有在按下回车键时才会提交更改,如果在单元格外部单击鼠标,则在单元格中输入的数据将丢失。

另一方面,可以正常工作的一个功能是,我可以选择文本,并使用鼠标在 TextField 中重新定位插入符号,次数不限。

这里有两个问题分别与这两个问题有关:

Java FX 2 表格单元格编辑和焦点

javafx 2.1 更新表格视图

当第一个问题的答案单独应用时,我只需单击一次即可编辑单元格(在选择行之后),我仍然可以选择文本并移动插入符号。

当第二个问题的答案自行应用时,在不按下回车键的情况下提交编辑,但我只能重新定位插入符号或选择文本一次,如果我再次尝试,则提交编辑.

当我将两个答案一起应用时,成功应用焦点并在单击鼠标时提交编辑,但我失去了重新定位插入符号或完全选择文本的能力。单元格内的任何鼠标单击都会提交编辑。

我的问题是如何在不失去定位插入符号和选择文本的能力的情况下解决最初的 2 个问题?

4

2 回答 2

1

在回答他自己的问题TableView - Better Editing through Binding 时尝试 jkaufmann 的示例应用程序? 他的绑定解决方案和 TableView 编辑语义的实现似乎充分解决了您在问题中提出的所有问题。

于 2012-06-27T01:13:45.697 回答
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;
        }
      };
  ...

  ...
  }


于 2020-04-13T20:59:31.200 回答