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