2012-04-26 70 views
6

我一直在学习JavaFX 2的一些内容,但是我遇到了可编辑表格单元的问题,我找不到解决方案。为了节省粘贴了大量的代码,我已经创建了一个包含JavaFX的文档只有TableView中示例项目:http://docs.oracle.com/javafx/2/ui_controls/table-view.htmJava FX 2表格单元格编辑和聚焦

如果你运行了这个代码,您看到此行为:

  1. 点击一行选择该行。
  2. 单击所选行中的单元格将单元格转换为文本字段,以便可以编辑该单元格。
  3. 单击文本字段可以对内容进行编辑。

问题是,这是三次点击,以达到单元格可以编辑的点。我想实现的是当创建(例如第2步)焦点中的文本字段直接切换到文本字段。

我最好的猜测就如何实现这一目标是增加textField.requestFocus()到的startEditing()方法的末尾:

@Override 
public void startEdit() { 
    super.startEdit(); 

    if (textField == null) { 
     createTextField(); 
    } 
    setGraphic(textField); 
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
    textField.selectAll(); 
    textField.requestFocus(); 
} 

但这不起作用。如果我将焦点侦听器添加到文本字段中,我发现它会获得焦点,但会再次失去焦点。在侦听器中插入一个中断点似乎表明TableView在显示文本字段之前重新获得焦点。

因此,问题是如何在编辑开始时将注意力集中到文本字段?

回答

8

能否请您与更换线textField.requestFocus();

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

,然后再试一次。

+1

谢谢乌鲁克,这是固定的。看看runLater的文档,虽然我猜测这可能会失败,因为它不能保证它的运行时间 - 大概它可以在表格抓取之前运行。 – wobblycogs 2012-04-26 11:02:15

+0

我同意wobblycogs,我已经使用runlater技巧在过去几次要求重点,它一直为我工作,但缺乏确定性,它会继续工作并不会给我一个温暖,模糊感觉它。 (另一种方法是使用时间轴将焦点请求推回到后面 - 但这种方法有它自己的问题)。 – jewelsea 2012-04-26 18:10:21