TreeSelectionListener
と、それが呼び出されているタイミングstopCellEditing()
メソッドにどのように関連しているかについて、あなたの質問を理解しているかどうかはよくわかりません。カスタムを作成していますTreeCellEditor
か?もしそうなら、このエディターのセットアップに関する詳細情報が役立つでしょう。
JTable
ただし、 のセル編集、外部コンポーネントへのフォーカスの喪失、および編集セルへの影響に関する以前の項目も参照しました。私はあなたが同様の解決策を望んでいるというヒントとしてそれを取りましたJTree
...
前述のとおり、既定JTree
のプロパティの処理は実装されていません"terminateEditOnFocusLost"
。これは、自分でできるという意味ではありません。
のコードを見ると、JTable
かなり簡単です。JTree
フォーカスが変更されたときに がまだフォーカスを持っているかどうかを識別するだけのクラスがまとめられ、そうでない場合は を呼び出しstopEditing()
、それが失敗した場合は を呼び出しますcancelEditing()
。これがツリーに適合したものです。
class CellEditorRemover implements PropertyChangeListener {
KeyboardFocusManager focusManager;
public CellEditorRemover(KeyboardFocusManager fm) {
this.focusManager = fm;
}
public void propertyChange(PropertyChangeEvent ev) {
if (!tree.isEditing() ||
tree.getClientProperty("terminateEditOnFocusLost") != Boolean.TRUE)
{
return;
}
Component c = focusManager.getPermanentFocusOwner();
while (c != null) {
if (c == tree) { // focus remains inside the tree
return;
} else if ((c instanceof Window)
|| (c instanceof Applet && c.getParent() == null))
{
if (c == SwingUtilities.getRoot(tree)) {
if (!tree.getCellEditor().stopCellEditing()) {
tree.getCellEditor().cancelCellEditing();
}
}
break;
}
c = c.getParent();
}
}
}
ツリーは何らかの方法でこのクラスにアクセスできる必要があることに注意してください。これを機能させるには、いくつかのセットアップ コールを実行する必要があります。
tree.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
KeyboardFocusManager fm =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
editorRemover = new CellEditorRemover(fm);
fm.addPropertyChangeListener("permanentFocusOwner", editorRemover);
これには、 a を押したときの動作JTree
と同じように動作させるという追加の利点があります。JTable
JButton