2

説明 (文字列) と優先値 (int) を持つカスタム オブジェクトがあります。このタイプの異なるオブジェクト間には階層関係があるため、これらの値を JTree に表示します。優先順位は表示目的では重要ではないため、JTree ノードの説明のみを表示します。

JTree ノード (リーフまたはノード) を編集するときに JDialog ポップアップを表示したいと考えています。たとえば、F2 を押します。このダイアログは、説明と優先度の両方を編集するために使用されます。

JTree がデフォルトでテキストをテキスト フィールドとして編集するのを防ぎ、代わりにカスタム ダイアログを呼び出すにはどうすればよいですか?

私が推測する簡単な方法は、DefaultTreeCellEditor クラスをサブクラス化し、isCellEditable メソッドをオーバーライドすることです。次に、そこで JDialog を呼び出し (カスタム DefaultTreeCellEditor をインスタンス化するときに関連する初期化要素を取得できます)、単純に false を返してデフォルトの編集を防止しますが、これは十分に洗練されているようには思えません。

4

2 に答える 2

2

別の方法として、ここorg.netbeans.swing.outline.Outlineで詳しく説明する を検討してください。

于 2010-09-18T14:27:34.777 に答える
2

を呼び出したので、F2 がツリー ノードで機能すると思いますJTree#setEditable(true)

F2 バインディングは にインストールされBasicTreeUI#installKeyboardActionsます。通常の方法で独自のバインディングをインストールできます。

JTree tree = new JTree(new String[]{"a", "b", "c"});
tree.setEditable(true);
InputMap m = tree.getInputMap(JComponent.WHEN_FOCUSED);
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
m.put(ks, "actionMapKey");
tree.getActionMap().put("actionMapKey", new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        // do your stuff
    }
});

JComponent.WHEN_IN_FOCUSED_WINDOW通常はこちらの方が望ましいJComponent.WHEN_FOCUSEDですが、BasicTreeUI は後者を使用します。

別のキーを使用したい場合は、F2 バインディングを削除するのが少し面倒です。これは、親の入力マップにあるためです。

m.remove(ks);
if( m.getParent() != null )
    m.getParent().remove(ks);
于 2010-09-18T23:05:18.187 に答える