1

我有一个带有多个节点的 JTree,每个节点都有一个不同的关联 JPanel,我想向用户显示。我使用了自定义 TreeCellRenderer 并且我的代码目前按原样工作,但是(我认为)它有点太笨重了,我对此感到担忧

1)如果我只是选择了一个树节点,我的代码将一遍又一遍地刷新 JPanel。一旦选定的节点显示 JPanel 一次,我不希望它再次显示,除非在两者之间选择了另一个节点。

2) 如果用户在我的计时器为 node1 运行时选择了不同的节点(比如说 node2),我不想费心显示 node1 的 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 Selection 侦听器吗?

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具有单一实现方法的方法,并且每次 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 回答