我有一个包含多个节点的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;
displayPanel函数:
// 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对我来说仍然有点混乱。我很感激有关如何有效运行的任何建议。
答案 0 :(得分:2)
也许我在这里遗漏了一些东西,但你不能只在树上使用Tree Selection监听器吗?
tree = new JTree(treeModel);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent arg0) {
//Code here to get selection and display panel
}
});
答案 1 :(得分: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());
}
});