1

複数のノードを持つ JTree があり、各ノードには、ユーザーに表示したい別の関連付けられた JPanel があります。私はカスタム TreeCellRenderer を利用しており、私のコードは現在そのまま機能していますが、(私は思うに)少しぎこちなく、懸念があります。

1) ツリー ノードを選択したままにしておくと、コードが JPanel を何度も更新し続けます。選択したノードが JPanel を一度表示すると、その間に別のノードが選択されない限り、再度表示したくありません。

2)ノード1のタイマーが実行されている間にユーザーが別のノード(ノード2としましょう)を選択した場合、ユーザーがそこから移動したため、ノード1のJPanelをわざわざ表示したくありません。

これが私の興味のあるコードです:

Component ret = super.getTreeCellRendererComponent(tree, value,
            selected, expanded, leaf, row, hasFocus);

    DefaultMutableTreeNode entry = (DefaultMutableTreeNode)value;


    // if the node is selected
    if(sel)
    {
// set the background of the node
        setBackgroundNonSelectionColor(new Color(0x91, 0xC5, 0xFF));
// display the JPanel for the node
        displayPanel(entry);
    }
    else
    {
// if the node isn't selected then no background selection color
        setBackgroundNonSelectionColor(Color.WHITE);
    }


    return ret;

ディスプレイパネル機能:

// display the node's JPanel after sleeping for 1s
private void displayPanel(final DefaultMutableTreeNode entry)
{
    Thread thr = new Thread(){

        public void run(){

                // sleep for 1000ms
                    CF.sleep("1000");

// display the panel for this node
                    CF.displayPanel(entry);
            }
          };
    thr.start();
}

正直なところ、DefaultTreeCellRenderer はまだ少し混乱しています。これを効率的に実行する方法についてアドバイスをいただければ幸いです。

4

2 に答える 2

2

ここで何かが足りないのかもしれませんが、ツリーでツリー選択リスナーを使用することはできませんか?

tree = new JTree(treeModel);
tree.addTreeSelectionListener(new TreeSelectionListener() {     
    public void valueChanged(TreeSelectionEvent arg0) {
       //Code here to get selection and display panel
    }
});
于 2013-03-01T18:54:40.230 に答える
1

TreeCellRenderer「レンダリング」を目的としています。与えられたオブジェクトの表現は何ですか? ラベルですか?チェックボックスですか?もっと複雑な何か?基本的に、JTree の各ノードの表現をディスプレイに「出力」するために使用されます。レンダリングは、予測できない瞬間に何度も発生する可能性があるため、選択をリッスンするのには適していません。

探しているのは、TreeSelectionListener実装するメソッドが 1 つあり、JTree の選択が変更されるたびにトリガーされる です。

でリスナーを追加しますjavax.swing.JTree.getSelectionModel().addTreeSelectionListener()

final JTree tree = ...;
tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
    public void valueChanged(TreeSelectionEvent e) {
         if (tree.getSelectionPath()!=null)
             displayPanel((DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent());
    }
});
于 2013-03-01T18:54:54.990 に答える