1

JavaFX 8 TreeTableView セルがフォーカスを失ったときに編集をコミットしようとしています。質問は既に出されていますが、以下の試みがうまくいかない理由を理解したいと思います。より具体的には、セルのfocusedPropertyへのリスナーが呼び出されない理由。

Item<String, Object>は私のデータ表現であり、 の拡張ですMap<String, Object>

基本的に、標準のテキスト セル ファクトリを、標準のセル ファクトリを使用してセルを作成する新しいセル ファクトリ内にラップし、その focusdProperty にリスナーを追加します。フォーカスが失われると、セルのテキストをそこに保存します。

ただし、出力には、イベント リスナーが呼び出されていないことが示されます。

テキスト コントロールを直接提供するメソッドを識別できなかったため、セルの focusdProperty にリスナーを追加しました。getGraphic() メソッド (どこかで読んだのは、セル内にあるノードを指しているため、誤った名前です) は null ポインターを返します。

リスナーが呼び出されない理由は何ですか? ありがとう。

// 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);
4

1 に答える 1