JAVAFX 8 TreeTableView:为什么这段代码没有检测到失去焦点的细胞?

时间:2015-10-29 19:06:03

标签: event-handling javafx-8 eventhandler treetableview

我正在尝试在JavaFX 8 TreeTableView单元失去焦点时提交编辑。我看到问题已经被提出,但我想理解为什么我的下面的尝试不起作用。更具体地说,为什么不调用单元格的focusedProperty的监听器。

Item<String, Object>是我的数据表示,是Map<String, Object>的扩展名。

基本上,我将标准文本单元工厂包装在一个新的单元工厂中,该工厂使用标准单元工厂来创建一个单元,并为其focusedProperty添加一个监听器。当焦点丢失时,我将单元格文本存储在其上。

但是,打印输出表明从不调用事件监听器。

我将监听器添加到了单元格的focusedProperty,因为我无法识别直接给出文本控件的方法。 getGraphic()方法(我在某处读到的是用词不当,因为它指向单元格中的任何节点)返回空指针。

知道为什么永远不会调用侦听器?感谢。

// obtain usual cell factory for text editing
Callback<TreeTableColumn<Item<String, Object>, String>, TreeTableCell<Item<String, Object>, String>>
   callBackForTreeTableColumn = TextFieldTreeTableCell.forTreeTableColumn();

// create a new cell factory that delegates the cell creation to the standard factory
// and then adds a listener to cell's focusedProperty:
Callback<TreeTableColumn<Item<String, Object>, String>, TreeTableCell<Item<String, Object>, String>>
    callBackWithOnFocusedListener = new Callback<TreeTableColumn<Item<String, Object>, String>, TreeTableCell<Item<String, Object>, String>> () {

    @Override
    public TreeTableCell<Item<String, Object>, String> call(TreeTableColumn<Item<String, Object>, String> column) {
        TreeTableCell<Item<String, Object>, String> cell = callBackForTreeTableColumn.call(column);
        System.out.println(System.currentTimeMillis() + ": cell created!"); 
        cell.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
            System.out.println(System.currentTimeMillis() + ": Focus changed!");    
            if (! isNowFocused) {
                System.out.println(System.currentTimeMillis() + ": Lost focus, going to commit!");  
                Item<String, Object> item = cell.getTreeTableRow().getTreeItem().getValue();
                item.put(header, cell.getText());
            }
        });
        return cell;
};
column.setCellFactory(callBackWithOnFocusedListener);

1 个答案:

答案 0 :(得分:2)

为什么我没有看到focusProperty 发生变化的简短回答是没有变化,因为该属性始终为false。

原因是,树/表/单元格的聚焦属性(可以说是错误的)用于表示Tree / TableView的FocusModel的焦点单元格(对比&#34;真实&#34;焦点作为focusOwner),但仅限于cellSelectionEnabled。

updateFocus(在TableCell中)的相关代码片段,名为f.i.通过InvalidationListener到FocusModel的focusedProperty:

private void updateFocus() {
    final boolean isFocused = isFocused();
    if (! isInCellSelectionMode()) {
        if (isFocused) {
            setFocused(false);
        }
        return;
    }
    ...
}