根据我对您问题的理解,您想触发树中特定节点的渲染。这应该通过TreeModel 执行以触发正确的事件(即treeNodesChanged)。 DefaultTreeModel 为此提供了一个实用方法:nodeChanged。
但是,JTree 中的工具提示是由 JTree 通过重新调用 TreeCellRenderer 主动处理的,这意味着无需执行任何操作来更改工具提示。每次需要显示工具提示时,都会执行给定节点的渲染。请参阅这个不断更新其工具提示的示例(只需在树的节点周围移动鼠标)。
import java.awt.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
public class TestTree {
public class MyTreeCellRenderer extends DefaultTreeCellRenderer {
private int rendering = 0;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component cell = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
if (cell instanceof JComponent) {
((JComponent) cell).setToolTipText("Hello " + rendering++);
if (value instanceof Node && cell instanceof JLabel) {
((JLabel) cell).setText(((Node) value).name);
}
}
return cell;
}
}
private JFrame f;
private JTree tree;
protected void initUI() {
Node root = new Node("Root");
fillTree(root, 5, "Some tree label");
DefaultTreeModel model = new DefaultTreeModel(root);
tree = new JTree(model);
ToolTipManager.sharedInstance().registerComponent(tree);
tree.setCellRenderer(new MyTreeCellRenderer());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(new JScrollPane(tree));
f.pack();
f.setVisible(true);
}
public void fillTree(Node parent, int level, String label) {
for (int i = 0; i < 5; i++) {
Node node = new Node(label + " " + i);
parent.addNode(node);
if (level > 0) {
fillTree(node, level - 1, label);
}
}
}
public class Node implements TreeNode {
private Node parent;
private List<Node> children;
private String name;
public Node(String name) {
this.name = name;
this.children = new ArrayList<TestTree.Node>();
}
public void addNode(Node child) {
children.add(child);
child.parent = this;
}
@Override
public TreeNode getChildAt(int childIndex) {
return children.get(childIndex);
}
@Override
public int getChildCount() {
return children.size();
}
@Override
public Node getParent() {
return parent;
}
@Override
public int getIndex(TreeNode node) {
return children.indexOf(node);
}
@Override
public boolean getAllowsChildren() {
return true;
}
@Override
public boolean isLeaf() {
return children.size() == 0;
}
@Override
public Enumeration<Node> children() {
return Collections.enumeration(children);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTree().initUI();
}
});
}
}