private boolean flag = false; public BlinkNodeTree() { setCellRenderer(new BlinkRenderer()); this.refreshThread.start(); } public class BlinkRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasFocus); BlinkNode bc = (BlinkNode) blinkNodeMap.get(value); if (bc != null) { if (flag ) { setForeground(bc.color1); } else { setForeground(bc.color2); } }
return this; } } private static class BlinkNode { Color color1, color2; long blinkCount;
public BlinkNode(int blinkCount, Color color1, Color color2) { this.blinkCount = (long)blinkCount*2; this.color1 = color1; this.color2 = color2; } }
public void blink(TreeNode node, int blinkCount, Color color1, Color color2) { synchronized (blinkNodeMap) { blinkNodeMap.put(node, new BlinkNode(blinkCount, color1, color2)); blinkNodeMap.notifyAll(); } }
private class BlinkThread extends Thread { public void run() { while (true) { synchronized (blinkNodeMap) { while (blinkNodeMap.isEmpty()) { try { blinkNodeMap.wait(); } catch (InterruptedException e) {} } flag = ! flag; Iterator iter = blinkNodeMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); TreeNode treeNode = (TreeNode) entry.getKey(); BlinkNode bc = (BlinkNode) entry.getValue();
bc.blinkCount--; if (bc.blinkCount <= 0) { iter.remove(); }
import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;public class BlinkNodeTree extends JTree {
private Map blinkNodeMap = new HashMap();
private Thread refreshThread = new BlinkThread();
private boolean flag = false; public BlinkNodeTree() {
setCellRenderer(new BlinkRenderer());
this.refreshThread.start();
} public class BlinkRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(
tree, value, sel, expanded, leaf, row, hasFocus); BlinkNode bc = (BlinkNode) blinkNodeMap.get(value);
if (bc != null) {
if (flag ) {
setForeground(bc.color1);
}
else {
setForeground(bc.color2);
}
}
return this;
}
} private static class BlinkNode {
Color color1, color2;
long blinkCount;
public BlinkNode(int blinkCount, Color color1, Color color2) {
this.blinkCount = (long)blinkCount*2;
this.color1 = color1;
this.color2 = color2;
}
}
public void blink(TreeNode node, int blinkCount, Color color1, Color color2) {
synchronized (blinkNodeMap) {
blinkNodeMap.put(node, new BlinkNode(blinkCount, color1, color2));
blinkNodeMap.notifyAll();
}
}
private class BlinkThread extends Thread {
public void run() {
while (true) {
synchronized (blinkNodeMap) {
while (blinkNodeMap.isEmpty()) {
try {
blinkNodeMap.wait();
} catch (InterruptedException e) {}
}
flag = ! flag;
Iterator iter = blinkNodeMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
TreeNode treeNode = (TreeNode) entry.getKey();
BlinkNode bc = (BlinkNode) entry.getValue();
bc.blinkCount--; if (bc.blinkCount <= 0) {
iter.remove();
}
}
repaint();
}
try {
sleep(500);
} catch (InterruptedException e) {
}
}
}
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
} BlinkNodeTree tree = new BlinkNodeTree();
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
TreeNode rootNode = (TreeNode) model.getRoot();
TreeNode node = rootNode.getChildAt(1);
tree.blink(rootNode, Integer.MAX_VALUE, Color.RED, Color.BLUE);
tree.blink(node, Integer.MAX_VALUE, Color.MAGENTA, null); JScrollPane sp = new JScrollPane(tree); JFrame f = new JFrame("BlinkTreeTest");
f.getContentPane().add(sp, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}