Java 如何根据JTree选择优化显示不同的JPanel

Java 如何根据JTree选择优化显示不同的JPanel,java,swing,jtree,Java,Swing,Jtree,我有一个包含多个节点的JTree,每个节点都有一个不同的关联JPanel,我想向用户显示。我使用了一个定制的TreeCellRenderer,我的代码目前可以正常工作,但是(我认为)它有点太笨重了,我对此表示担忧 1) 如果我只选择了一个树节点,那么我的代码将一次又一次地刷新JPanel。一旦选定的节点显示了JPanel一次,我不希望它再次显示,除非在两者之间选择了另一个节点 2) 如果用户在我的计时器为node1运行时选择了不同的节点(比如node2),我不想麻烦显示node1的JPanel,

我有一个包含多个节点的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对我来说仍然有点困惑。如果您能给我一些建议,告诉我如何有效地运行,我将不胜感激。

也许我在这里遗漏了一些东西,但您不能在树上使用一个树选择侦听器吗

tree = new JTree(treeModel);
tree.addTreeSelectionListener(new TreeSelectionListener() {     
    public void valueChanged(TreeSelectionEvent arg0) {
       //Code here to get selection and display panel
    }
});

TreeCellRenderer
用于“渲染”目的。给定对象的表示形式是什么?它是一个标签吗?是复选框吗?更复杂的事情?基本上,它用于在显示器上“打印”JTree的每个节点的表示。渲染可能会在不可预知的时刻发生多次,因此不是一个听取选择的好地方

您正在寻找的是一个
TreeSelectionListener
,它有一个单一的方法来实现,并且每次JTree的选择发生变化时都会触发它

使用
javax.swing.JTree.getSelectionModel().addTreeSelectionListener()
添加您的侦听器


第一段代码的上下文不是很清楚,它包含在哪里?另外,为什么不使用树选择事件来选择和
JPanel
一起显示呢?很抱歉,代码在扩展DefaultTreeCellRenderer的类中。如果您需要更多的上下文,我可以包含代码的其余部分。我没有想到使用树选择事件,因为我目前没有在那里听一个动作,但这可能是一个更好的主意。是的,我想得太多了,使它过于复杂。我会在5分钟内接受你的回答。谢谢你,我已经用TreeSelectionListener实现了我想要的效果。现在问这个问题让我觉得很愚蠢,但如果其他人对此有困难,我会发布我的解决方案。@Matt你能告诉我你在哪里发布了你的解决方案吗?因为我在这个地球上已经挣扎了好几天了?当这个线程仍然处于活动状态并且问题已经解决时,我不想问同样的问题。嗨,纪尧姆,我不确定你是否可以在StackOverflow上发送消息,但是感谢你指导我使用invokeLater,而不仅仅是否决我。我目前在整个程序中更新GUI,而不使用invokeLater。我将确保在整个代码和更新过程中进行解析。
final JTree tree = ...;
tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
    public void valueChanged(TreeSelectionEvent e) {
         if (tree.getSelectionPath()!=null)
             displayPanel((DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent());
    }
});