JTree 根据叶节点值 查找该叶节点 并设置该叶节点闪烁 本帖最后由 magic_kid_2010 于 2012-08-29 00:41:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.awt.Component;import java.awt.Dimension;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Icon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTree;import javax.swing.Timer;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeCellRenderer;public class Test { private static boolean isHidden; public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(800, 600); DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2"); final JTree tree = new JTree(root); tree.setCellRenderer(new MyCellRenderer()); root.add(node1); root.add(node2); tree.expandRow(0); frame.add(tree); Timer timer = new Timer(500, new ActionListener() { public void actionPerformed(ActionEvent event) { isHidden = !isHidden; tree.updateUI(); } }); timer.start(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } private static class MyCellRenderer extends DefaultTreeCellRenderer { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { leafIcon = getLeafIcon(); if ("节点1".equals(value.toString()) && !isHidden) { Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); if (renderer instanceof JLabel) { JLabel label = (JLabel)renderer; Icon icon = label.getIcon(); Dimension size = label.getPreferredSize(); size.width = 100; size.height = icon.getIconHeight(); label.setPreferredSize(size); label.setIcon(null); } return renderer; } else { return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } } }} DefaultMutableTreeNode 提供遍历树的方法。Enumeration depthFirstEnumeration() 深度优先的顺序遍历Enumeration breadthFirstEnumeration() 广度优先的顺序遍历比如:Enumeration e = tree.breadthFirstEnumeration();while(e.hasMoreElements()){ DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement(); .............. ..............} 一般来说遍历树结构建议用递归,也就是从根节点开始,进行递归搜索叶子节点。大致如下: // 主入口函数 public void setOnline(DefaultMutableTreeNode root, String friends) { String[] fs = friends.split("\\s"); HashSet<String> set = new HashSet<String>(Arrays.asList(fs)); // 转成Set便于快速检索 setOnlineRecursion(root, set); // 调用递归子函数 xxoo.UpdateUI(); // 刷新下树显示 } // 递归函数 private void setOnlineRecursion(DefaultMutableTreeNode node, Set onlines) { Enumeration<DefaultMutableTreeNode> children = node.children(); while (children.hasMoreElements()) { DefaultMutableTreeNode child = children.nextElement(); if (child.isLeaf()) { // 是否叶子节点 TreeNode treeNode = (TreeNode) node.getUserObject(); if (onlines.contains(treeNode.getId())) { // 检查该ID是否在set中 treeNode.setStatus(QQStatue.在线); } else { treeNode.setStatus(QQStatue.离线); } } else { // 非叶子节点则继续递归调用了 setOnlineRecursion(child, onlines); } } } 要实现QQ那种效果,用DefaultMutableTreeNode显得有些力不从心了,就算近似达到,也不好看。选用其它技术吧。 package com.mvs;import java.awt.Component;import java.awt.Dimension;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Icon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTree;import javax.swing.Timer;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeCellRenderer;public class JTreeTest { private static boolean isHidden; public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(800, 600); DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2"); final JTree tree = new JTree(root); tree.setCellRenderer(new MyCellRenderer()); root.add(node1); root.add(node2); tree.expandRow(0); frame.add(tree); final Timer timer = new Timer(500, new ActionListener() { public void actionPerformed(ActionEvent event) { isHidden = !isHidden; tree.updateUI(); } }); timer.start(); tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); String name=node.toString(); if(node.isLeaf()){ if(name.equals("节点1")){ timer.stop(); tree.setCellRenderer(new MyRenderer()); } } } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } private static class MyCellRenderer extends DefaultTreeCellRenderer { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { leafIcon = getLeafIcon(); if ("节点1".equals(value.toString()) && !isHidden) { Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); if (renderer instanceof JLabel) { JLabel label = (JLabel)renderer; Icon icon = label.getIcon(); Dimension size = label.getPreferredSize(); size.width = 100; size.height = icon.getIconHeight(); label.setPreferredSize(size); label.setIcon(null); } return renderer; } else { return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } } } private static class MyRenderer extends DefaultTreeCellRenderer { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { leafIcon = getLeafIcon(); if ("节点1".equals(value.toString()) && !isHidden) { Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); JLabel label = (JLabel)renderer; Icon icon = label.getIcon(); Dimension size = label.getPreferredSize(); size.width = 100; size.height = icon.getIconHeight(); label.setPreferredSize(size); label.setIcon(null); } return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } }} 当鼠标点击时取消闪烁 package com.mvs;import java.awt.Component;import java.awt.Dimension;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Icon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTree;import javax.swing.Timer;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeCellRenderer;public class JTreeTest { private static boolean isHidden; public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(800, 600); DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2"); final JTree tree = new JTree(root); tree.setCellRenderer(new MyCellRenderer()); root.add(node1); root.add(node2); tree.expandRow(0); frame.add(tree); final Timer timer = new Timer(500, new ActionListener() { public void actionPerformed(ActionEvent event) { isHidden = !isHidden; tree.updateUI(); } }); timer.start(); tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); String name=node.toString(); if(node.isLeaf()){ if(name.equals("节点1")){ timer.stop(); tree.setCellRenderer(new MyRenderer()); } } } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } private static class MyCellRenderer extends DefaultTreeCellRenderer { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { leafIcon = getLeafIcon(); if ("节点1".equals(value.toString()) && !isHidden) { Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); if (renderer instanceof JLabel) { JLabel label = (JLabel)renderer; Icon icon = label.getIcon(); Dimension size = label.getPreferredSize(); size.width = 100; size.height = icon.getIconHeight(); label.setPreferredSize(size); label.setIcon(null); } return renderer; } else { return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } } } private static class MyRenderer extends DefaultTreeCellRenderer { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { leafIcon = getLeafIcon(); if ("节点1".equals(value.toString()) && !isHidden) { Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); JLabel label = (JLabel)renderer; Icon icon = label.getIcon(); Dimension size = label.getPreferredSize(); size.width = 100; size.height = icon.getIconHeight(); label.setPreferredSize(size); label.setIcon(null); } return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } }} 可以点击时取消闪烁 竞赛题目、求牛人解答、JAVA算法题、有时间限制 线程问题 请教关于我这个从DB取数据的程序的问题 请大家帮我看看,分析一下这两个题 JNI 问题 类型判断的问题 逻辑表达式,位运算,布尔逻辑运算符等有什么区别?我头都高大了? applet通信? 请问:什么是组合?看了THINGKING IN JAVA后,还是不是很明白 那位兄弟知道那有Jrun studio4.0下载吗? Robot mouseMove 在Win7下无效,为什么? 200高分求高效时间排序算法和程序!
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;public class Test {
private static boolean isHidden; public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(800, 600);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
final JTree tree = new JTree(root);
tree.setCellRenderer(new MyCellRenderer());
root.add(node1);
root.add(node2);
tree.expandRow(0);
frame.add(tree);
Timer timer = new Timer(500, new ActionListener() {
public void actionPerformed(ActionEvent event) {
isHidden = !isHidden;
tree.updateUI();
}
});
timer.start();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} private static class MyCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
leafIcon = getLeafIcon();
if ("节点1".equals(value.toString()) && !isHidden) {
Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);
if (renderer instanceof JLabel) {
JLabel label = (JLabel)renderer;
Icon icon = label.getIcon();
Dimension size = label.getPreferredSize();
size.width = 100;
size.height = icon.getIconHeight();
label.setPreferredSize(size);
label.setIcon(null);
}
return renderer;
} else {
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
}
}
Enumeration breadthFirstEnumeration() 广度优先的顺序遍历比如:
Enumeration e = tree.breadthFirstEnumeration();
while(e.hasMoreElements()){
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
..............
..............
}
public void setOnline(DefaultMutableTreeNode root, String friends) {
String[] fs = friends.split("\\s");
HashSet<String> set = new HashSet<String>(Arrays.asList(fs)); // 转成Set便于快速检索
setOnlineRecursion(root, set); // 调用递归子函数
xxoo.UpdateUI(); // 刷新下树显示
} // 递归函数
private void setOnlineRecursion(DefaultMutableTreeNode node, Set onlines) {
Enumeration<DefaultMutableTreeNode> children = node.children();
while (children.hasMoreElements()) {
DefaultMutableTreeNode child = children.nextElement();
if (child.isLeaf()) { // 是否叶子节点
TreeNode treeNode = (TreeNode) node.getUserObject();
if (onlines.contains(treeNode.getId())) { // 检查该ID是否在set中
treeNode.setStatus(QQStatue.在线);
} else {
treeNode.setStatus(QQStatue.离线);
}
} else {
// 非叶子节点则继续递归调用了
setOnlineRecursion(child, onlines);
}
}
}
选用其它技术吧。
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;public class JTreeTest {
private static boolean isHidden;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(800, 600);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
final JTree tree = new JTree(root);
tree.setCellRenderer(new MyCellRenderer());
root.add(node1);
root.add(node2);
tree.expandRow(0);
frame.add(tree);
final Timer timer = new Timer(500, new ActionListener() {
public void actionPerformed(ActionEvent event) {
isHidden = !isHidden;
tree.updateUI();
}
});
timer.start();
tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
String name=node.toString(); if(node.isLeaf()){
if(name.equals("节点1")){
timer.stop();
tree.setCellRenderer(new MyRenderer());
}
}
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} private static class MyCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
leafIcon = getLeafIcon();
if ("节点1".equals(value.toString()) && !isHidden) {
Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);
if (renderer instanceof JLabel) {
JLabel label = (JLabel)renderer;
Icon icon = label.getIcon();
Dimension size = label.getPreferredSize();
size.width = 100;
size.height = icon.getIconHeight();
label.setPreferredSize(size);
label.setIcon(null);
}
return renderer;
} else {
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
}
private static class MyRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
leafIcon = getLeafIcon();
if ("节点1".equals(value.toString()) && !isHidden) {
Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); JLabel label = (JLabel)renderer;
Icon icon = label.getIcon();
Dimension size = label.getPreferredSize();
size.width = 100;
size.height = icon.getIconHeight();
label.setPreferredSize(size);
label.setIcon(null);
}
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
}
当鼠标点击时取消闪烁
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;public class JTreeTest {
private static boolean isHidden;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(800, 600);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
final JTree tree = new JTree(root);
tree.setCellRenderer(new MyCellRenderer());
root.add(node1);
root.add(node2);
tree.expandRow(0);
frame.add(tree);
final Timer timer = new Timer(500, new ActionListener() {
public void actionPerformed(ActionEvent event) {
isHidden = !isHidden;
tree.updateUI();
}
});
timer.start();
tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
String name=node.toString(); if(node.isLeaf()){
if(name.equals("节点1")){
timer.stop();
tree.setCellRenderer(new MyRenderer());
}
}
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} private static class MyCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
leafIcon = getLeafIcon();
if ("节点1".equals(value.toString()) && !isHidden) {
Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus);
if (renderer instanceof JLabel) {
JLabel label = (JLabel)renderer;
Icon icon = label.getIcon();
Dimension size = label.getPreferredSize();
size.width = 100;
size.height = icon.getIconHeight();
label.setPreferredSize(size);
label.setIcon(null);
}
return renderer;
} else {
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
}
private static class MyRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
leafIcon = getLeafIcon();
if ("节点1".equals(value.toString()) && !isHidden) {
Component renderer = super.getTreeCellRendererComponent(tree, "", selected, expanded, leaf, row, hasFocus); JLabel label = (JLabel)renderer;
Icon icon = label.getIcon();
Dimension size = label.getPreferredSize();
size.width = 100;
size.height = icon.getIconHeight();
label.setPreferredSize(size);
label.setIcon(null);
}
return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
}
}
可以点击时取消闪烁