Java FX 2单元格编辑,焦点和文本选择

时间:2012-06-26 14:57:20

标签: javafx-2

我正在测试JavaFX 2.1并尝试使用可编辑的表视图来按照我希望的方式运行。

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

该示例有两个问题:

  1. 用户被迫点击一个单元格3次以进行编辑,一次选择该行,一次选择单元格并使其可编辑并再次单击以关注TextField
  2. 只有在按下回车键时才会提交更改,如果在单元格外单击鼠标,则单元格中输入的数据将丢失。
  3. 另一方面,一个功能正常的功能是,我可以选择文本,并使用鼠标将插入符号重新定位在TextField中多次。

    这里有两个问题,分别涉及这两个问题:

    Java FX 2 Table Cell Editing and Focus

    javafx 2.1 Updating TableView

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

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

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

    我的问题是如何解决原始的2个问题而不会失去定位插入符和选择文本的能力?

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;
        }
      };
  ...

  ...
  }