请看类:
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer{
    private CheckTreeSelectionModel selectionModel;
    private TreeCellRenderer delegate;
    public TristateCheckBox checkBox = new TristateCheckBox();    public CheckTreeCellRenderer(TreeCellRenderer delegate, CheckTreeSelectionModel selectionModel){
        this.delegate = delegate;
        this.selectionModel = selectionModel;
        setLayout(new BorderLayout());
        setOpaque(false);
        checkBox.setOpaque(false);
    }
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){
        Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
        TreePath path = tree.getPathForRow(row);
        if(path!=null){
            if(selectionModel.isPathSelected(path, true))
                checkBox.setState(TristateCheckBox.SELECTED);            else
                checkBox.setState(selectionModel.isPartiallySelected(path) ? null : TristateCheckBox.NOT_SELECTED);
        }
        removeAll();
        renderer.addMouseListener(new MouseAdapter() {
          public void mouseExited(MouseEvent e) {
            System.out.println("dddddddddddddddddd");
            setForeground(Color.black);
          }
          public void mouseEntered(MouseEvent e) {
            setForeground(Color.red);
          }
          public void mouseClicked(MouseEvent me){          }
        });
        add(checkBox, BorderLayout.WEST);
        add(renderer, BorderLayout.CENTER);
        return this;
    }
}
这是一个checktree,面板WEST加载checkBox,CENTER加载renderer
如果直接写renderer.setForeground(Color.red);则树节点字的颜色全部会变成红色,
这里我写renderer鼠标事件,想要达到当鼠标进入renderer时树节点字颜色变成红色,移出鼠标时变成黑色,为什么这个事件不执行?
或是有什么别的方法,可以让鼠标进入与离开树节点时该节点颜色发生变化?

解决方案 »

  1.   

    按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620 
    在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ 
      

  2.   

    楼上的,你还真挺长脸的啊,真好意思啊看看这是举报他的帖子,还挂着呢
    http://topic.csdn.net/u/20080124/08/b14ab841-be1e-4d0d-b16e-52f77fd3a764.html?seed=1573367784
      

  3.   


    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Rectangle;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.TreePath;
    public class T
    {
    public static void main(String[] args)
    {
    JTree tree = new JTree();
    tree.setCellRenderer(new TestTreeCellRenderer());

    JFrame f = new JFrame();
    f.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }class TestTreeCellRenderer extends DefaultTreeCellRenderer implements MouseMotionListener
    {
    private TreePath currentTreePath;
    private boolean listenerAdded = false; @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, 
    boolean sel, boolean expanded, boolean leaf,
    int row, boolean hasFocus)
    {
    if (!listenerAdded && tree != null) {
    tree.addMouseMotionListener(this);
    listenerAdded = true;
    }

    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
    if (currentTreePath != null && currentTreePath.getLastPathComponent() == value) {
    setForeground(Color.RED);
    } return this;
    } public void mouseDragged(MouseEvent e)
    {
    } public void mouseMoved(MouseEvent e)
    {
    JTree tree = (JTree) e.getSource();
    TreePath path = tree.getPathForLocation(e.getX(), e.getY());

    TreePath oldPath = currentTreePath;

    if (path == null) {
    currentTreePath = null;
    }
    else {
    currentTreePath = path;
    }

    if (oldPath != null) {
    Rectangle pathBounds = tree.getPathBounds(oldPath);
    if (pathBounds != null) {
    tree.repaint(pathBounds);
    }
    }
    if (currentTreePath != null) {
    Rectangle pathBounds = tree.getPathBounds(currentTreePath);
    if (pathBounds != null) {
    tree.repaint(pathBounds);
    }
    }
    }
    }
      

  4.   

    JAVA技术交流与学习:45633778技术交流,共同进步!!
      

  5.   

    对renderer里的东西写事件监听是不起作用的吧,我也做过像鼠标移动到表格或树的某个单元格(结点)触发事件的东西,不过都是针对table或者tree加监听,然后判断鼠标位置是否为我想处理的地方。