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