2

これは、これらの以前の質問に対するフォローアップです。

以下のようにプロパティを使用するとterminateEditOnFocusLost、テーブルがフォーカスを失ったときに CellEditor が正しく編集を停止します。

jtable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

私のJButtonでも動作します。ボタンを押すアクションが処理される前stopCellEditing()、TableCellEditor に対してメソッドが呼び出されます。しかし、JTree で使用すると、ツリーの選択が変更され、メソッドがbeforeで呼び出されます。TreeSelectionListener.valueChanged stopCellEditing()

最初に強制的に呼び出す方法があるかどうかstopCellEditing()、またはこの問題の回避策を講じる必要があるかどうかは誰にもわかりませんか?

4

2 に答える 2

1

JTreeに同様のクライアントプロパティがありませんSwing。しかし、、JXTreeから派生したクラスはJTree、次のSwingXようになりますinvokeStopEditing

を使用できない場合はSwingX、のソースコードをいつでも確認して、JXTreeこのStopEditingメカニズムがどのように機能するかを確認できます。JXTree SwingX 1.0 API Documentation and Javadoc (go to Source tab)

特に、行から始めて、などのプロパティの変更974を監視するためのリスナーが作成されます。permanentFocusOwnerKeyboardFocusManager

于 2009-09-29T19:01:23.710 に答える
0

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と同じように動作させるという追加の利点があります。JTableJButton

于 2009-10-04T02:09:53.667 に答える