JavaFX2在请求焦点后在“表格视图”编辑文本字段中设置插入符号位置

JavaFX2在请求焦点后在“表格视图”编辑文本字段中设置插入符号位置,java,tableview,javafx-2,javafx,Java,Tableview,Javafx 2,Javafx,在JavaFX2中,我创建了一个自定义TableCell,它覆盖startEdit()方法来请求焦点。因此,只要我在单元格上调用edit命令,出现的编辑文本字段就会聚焦 下一步是将插入符号位置设置为文本字段的结尾。但不知什么原因,它似乎不起作用。它总是放在第一个字符之前 以下是我迄今为止所做的尝试: public void startEdit() { if (!isEmpty()) { super.startEdit(); createTextField(

在JavaFX2中,我创建了一个自定义TableCell,它覆盖startEdit()方法来请求焦点。因此,只要我在单元格上调用edit命令,出现的编辑文本字段就会聚焦

下一步是将插入符号位置设置为文本字段的结尾。但不知什么原因,它似乎不起作用。它总是放在第一个字符之前

以下是我迄今为止所做的尝试:

public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();
        createTextField();
        setText(null);
        textField.end();
        setGraphic(textField);
        ((TextField)getGraphic()).end();
        textField.end();

        Platform.runLater(
                new Runnable() {
                    @Override
                    public void run() {
                        getGraphic().requestFocus();
                    }
                });
    }
}


public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();
        createTextField();
        setText(null);
        setGraphic(textField);
        textField.end();

        Platform.runLater(
                new Runnable() {
                    @Override
                    public void run() {
                        getGraphic().requestFocus();
                        textField.end(); 
                        ((TextField)getGraphic()).end();
                    }
                });
    }
}


public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();

        createTextField();
        setText(null);
        textField.end();
        setGraphic(textField);
        ((TextField)getGraphic()).end();
        getGraphic().requestFocus();
        ((TextField)getGraphic()).end();
        textField.end();
    }
}
合乎逻辑的方法是请求将焦点放在文本字段上,然后移动插入符号,但无论出于何种原因,它似乎都不起作用


也许有人能启发我?

我也有同样的问题,在尝试了很多不同的方法后,我终于找到了解决办法

不要问我为什么,但问题似乎是由为每次编辑创建一个新的文本字段引起的。如果重用现有的textfield,它就会工作

所以试试这个:

public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();

        if (textField == null)
            createTextField();
        else
            textField.setText(getString());

        setText(null);
        setGraphic(textField);

        Platform.runLater(
                new Runnable() {
                    @Override
                    public void run() {
                        textField.requestFocus();
                        textField.deselect(); 
                        textField.end(); 
                    }
                });
    }
}

以上两个答案都不能正确地解决自定义表格单元格文本字段中光标定位的问题。如果你发现上面的方法对你有效,那么这更多的是运气的问题,取决于光标定位之前控件的竞争条件

您需要按照JavaFX框架的精神在正确的时间修改GUI组件。i、 e.在控件布局子对象方法中。e、 g.您需要覆盖自定义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;
      }
    }
  };
我还注意到Java1.8.0241在TextFieldTableCell实现中也包含这个问题。更糟糕的是,TextField对于TextFieldTableCell实现是完全私有的,因此为了解决这个问题,我选择复制javax.scene.table.cell.TextFieldTableCell和javax.scene.table.cell.CellUtils的源代码。TextField在CellUtils中实例化,因此可以修复光标在其中的位置。e、 g

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

  ...
  }




static TextField createTextField(最终单元格、最终StringConverter转换器){
final TextField TextField=新的TextField(getItemText(单元格,转换器)){
private boolean first=true;
@重写受保护的void layoutChildren(){
super.layoutChildren();
//在文本末尾设置光标插入符号(并清除高亮显示)
如果(第一){
这个。结束();
第一个=假;
}
};
...
...
}

您应该尝试添加更多相关的标记以获得更多的曝光。当切换到编辑模式时,texfield中是否有文本?在Platform.runlater中,尝试textfield.settText(“一些文本”);并查看插入符号的位置。@uluk biy是的,当切换到编辑模式时,字段中有文本。当我请求Focus()时然后是setText(),插入符号仍然在第一个字符之前。我发现像positionCaret()、end()和selectAll()这样的方法只有当您将它们放在平台中时才起作用。runLater()方法并在您请求focus()后调用它们但这不适用于我的表格单元格工厂中的文本字段…它在那里仍然不起作用。