JTree und Hintergrund einzelner Nodes

yuccapalme

Grünschnabel
Hallo,

ich habe einen JTree mit DefaultTreeCellRenderer und hätte gerne einen Rollover-Effekt. D.h. der Hintergrund der Nodes soll sich ändern, wenn die Maus drüber fährt, ohne das die Nodes selber angewählt werden.
Kann mir jemand einen Tipp/Code dafür geben? Komme irgendwie nicht mehr weiter und finde auch nichts dazu.
 
Hallo,

nur mit dem CellRenderer wird es nicht funktionierern. Du wirst dem Renderer noch einen MouseMotionListener hinzufügen müssen.

Probiert hab ich es jetzt nicht. Aber es müsste eigentlich funktionieren.

MFG

Sascha
 
Hallo,

Schau mal hier
Java:
package sample;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;

public class TreeExample
    extends JFrame
{

  public TreeExample()
  {
    setSize(300, 300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    JTree tree = new JTree();
    final MyTreeCellRenderer cr = new MyTreeCellRenderer();
    tree.addMouseMotionListener(new MouseMotionListener(){

      public void mouseDragged(MouseEvent e)
      {
      }

      public void mouseMoved(MouseEvent e)
      {
        JTree tree = (JTree)e.getSource();
        
        int row = tree.getRowForLocation(e.getPoint().x, e.getPoint().y);
        cr.setRow(row);
        tree.repaint();
      }
      
    });
    tree.setCellRenderer(cr);
    add(tree);
  }
  /**
   * @param args
   */
  public static void main(String[] args)
  {
    new TreeExample().setVisible(true);
  }
  
  private class MyTreeCellRenderer extends DefaultTreeCellRenderer
  {
    
    private int row = -1;
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)
    {
      JLabel label =(JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
      
      if(row == getRow()){
        label.setForeground(Color.green);
      }
      
      return label;
    }
    /**
     * @return the row
     */
    public int getRow()
    {
      return row;
    }
    /**
     * @param row the row to set
     */
    public void setRow(int row)
    {
      this.row = row;
    }
    
    
  }

}

Ich hab es jetzt mit foreground gemacht. Mit Background hat es nicht funktioniert. Hab jetzt aber auch nicht die Zeit mich genau damit zu beschäftigen.

MFG

Sascha
 
Zurück