DefaultTreeCellRenderer Hintergrundfarbe

  • Themenstarter Themenstarter Polo488
  • Beginndatum Beginndatum
P

Polo488

Gast
Hallo Zusammen ich möchte gerne in meinem JTREE, je nach ebene ein andere Hintergrundfarbe(Komplette Zeile) haben, dafür habe ich mir folgendes Beispiel angeschaut.
http://www.java-forum.org/java-faq-beitraege/23426-jtree-teil-3-darstellung-daten.html

Und so umgesetzt
Java:
import java.awt.Color;
import java.awt.Component;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;

// Für die TreeIcons
public class MyRenderer extends DefaultTreeCellRenderer {
	
    Icon DataBaseIcon;
    Icon TableIcon;
    Icon FieldIcon; 
	
    public MyRenderer(){
    	DataBaseIcon = new ImageIcon("Icon/database-icon.png");
    	TableIcon = new ImageIcon("Icon/Windows-Table-icon.png");
    	FieldIcon = new ImageIcon("Icon/Field.png");
    }

    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);
        DefaultMutableTreeNode ItemValue = (DefaultMutableTreeNode)value;
        if (ItemValue.getUserObject() instanceof CustomTreeItem){
        	       
          CustomTreeItem Item =(CustomTreeItem)ItemValue.getUserObject();       
          if(Item.getHierachie()== Global.TreeHierachie.DataBase){
        	setIcon(DataBaseIcon);
          }
          if(Item.getHierachie()== Global.TreeHierachie.Table){
        	setIcon(TableIcon);
          }
          if(Item.getHierachie()== Global.TreeHierachie.Field){
        	setIcon(FieldIcon);
                setBackground(Color.red);//funktioniert nicht
          }
        }
        return this;
    }
}

Die Hintergrundfarbe wird nicht verändert
 
Das TreeUI ist ziemlich komplex. Hier mal ein Bsp. mit einer überschriebenen Methode des BasicTreeUI. Damit wird die Zeile zumindest nach hinten komplett "gefüllt". Kannst Dir ja mal die paintRow() des UIs anschauen.
Java:
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.TreePath;

public class TreeLineSelectionDemo extends JFrame {
	
	private int width=0;
	
	public TreeLineSelectionDemo() {
		
		JTree tree = new JTree() {
			public void paintComponent(Graphics g) {
				width = this.getWidth();
				super.paintComponent(g);
			}
		};
		BasicTreeUI ui = new BasicTreeUI() {
			protected void paintRow(Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
				bounds.width = width - bounds.x;
				super.paintRow(g, clipBounds, insets, bounds, path, row, isExpanded, hasBeenExpanded, isLeaf);
			}
		};
		tree.setUI(ui);
		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree), new JLabel("Hallo", JLabel.CENTER));
		this.getContentPane().add(split);
	}
	
	public static void main(String[] args) {
		JFrame frame = new TreeLineSelectionDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
Man könnte sich auch überlegen eine JList zu verwenden. Da ist die gestalterische Freiheit etwas größer/einfacher. Letztendlich ist ja ein JTree nichts anderes als eine "klappbare" Liste.
 

Zurück
Oben