请问高手:      
   如何  写  
       我想jtree里的文字,实现定时改变颜色,有闪烁的效果

解决方案 »

  1.   

    import java.awt.BorderLayout;
    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);
    }
    }