2016-07-13 22 views
2

Diese Frage basiert auf this question.Farbreihen in JTree

Ich möchte, dass der Baum auf der Ebene der Knoten unterschiedlich gefärbt ist. Diese Arbeit nur gut, wenn im die Standard-groundNonSelectionColor

this is how it Looks right now

Ich möchte mit, dass diese Farbe über die gesamte Breite des JScrollPanel abdeckt.

Beispielcode:

import java.awt.BorderLayout; 

import java.awt.Color; 

import java.awt.Component; 

import java.awt.Dimension; 

import java.awt.Rectangle; 


import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 

public class Main extends JFrame { 


public Main(){ 

    JFrame f = new JFrame(); 



    JTree tree = new JTree(); 

    MyTreeCellRenderer renderer = new MyTreeCellRenderer(); 

tree.setCellRenderer(renderer); 

    JScrollPane p = new JScrollPane(tree); 


    f.getContentPane().add(BorderLayout.CENTER,p); 
    f.setVisible(true); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setSize(400,400); 

} 


public static void main(String[] args) { 
    new Main(); 
} 
public static class MyTreeCellRenderer extends DefaultTreeCellRenderer{ 

    public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel, 
      boolean expanded,boolean leaf,int row,boolean hasFocus) { 


     JComponent component = (JComponent)super.getTreeCellRendererComponent(tree, value, sel,expanded, leaf, row,hasFocus); 

     if (getRowOfNode(value) != -1) { 

      DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; 


      switch (getRowOfNode(value)){ 
      //Different Level - Different Colors => 1 == Root    
       case 1: component.setBackground(Color.RED);break;   
       case 2: component.setBackground(Color.BLUE);component.setForeground(Color.WHITE);break; 
       case 3: component.setBackground(Color.YELLOW);break;      
      }     
     } 

     //component.setPreferredSize(new Dimension(tree.getWidth(),tree.getRowHeight()));   

     component.setOpaque(true); 

     return component; 

    } 
}   
     public static int getRowOfNode(Object value){ 
      if(value instanceof DefaultMutableTreeNode){    
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;    
       return node.getPath().length; 
      } 
      return -1; 
     } 

}

Hinweis: wenn i setPreferredSize das Gremium hinzufügen nicht überhaupt etwas zu zeigen (die tree.getWidth() funktioniert gut) mit Mit der Hilfe des obigen Links konnte ich die Auswahl Hintergrund über die ganze Zeile und nicht nur über den Text erreichen, aber ich bin nicht in der Lage, es so zu machen, alle Zeilen zu färben.

den Unterschied zur Lösung des Questino Angeben oben verlinkten:

In der Frage verknüpft die gesamte Zeile wir nur gefärbt werden, wenn die Option ausgewählt wird. Mein Problem besteht darin, die gesamte Zeile zu färben, wenn die Elemente nicht ausgewählt sind (in der Lösung der verknüpften Frage ist das Problem das gleiche wie in meinem Beispielbild!) - die ganze Zeile wird nur gefärbt, wenn ein Element ausgewählt ist - falls nein der Auswahl der Farb Happening wird auf den Titel des Knotens/Blatt reduziert werden)

+1

ist die Antwort von der Link nicht für Sie arbeiten? Ich denke, das ist ein einfacher Weg. – TomN

+0

Ich bearbeitet die Frage, um den Unterschied zwischen der Frage, die ich verknüpfte, und dem Problem, das ich habe – mayha

Antwort

3

Diese funktionieren könnte:

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class Main2 { 
    public JComponent makeUI() { 
    JTree tree = new ColorTree2(); 
    tree.setCellRenderer(new MyTreeCellRenderer()); 
    tree.setOpaque(false); 
    return new JScrollPane(tree); 
    } 

    static class ColorTree2 extends JTree { 
    @Override public void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setColor(getBackground()); 
     g2.fillRect(0, 0, getWidth(), getHeight()); 
     for (int i = 0; i < getRowCount(); i++) { 
     Object o = getPathForRow(i).getLastPathComponent(); 
     g2.setColor(getNodeColor(o)); 
     Rectangle r = getRowBounds(i); 
     g2.fillRect(0, r.y, getWidth(), r.height); 
     } 
     g2.dispose(); 
     super.paintComponent(g); 
    } 
    } 

    static class MyTreeCellRenderer extends DefaultTreeCellRenderer { 
    private final Color color = new Color(0x0, true); 
    @Override public Color getBackgroundSelectionColor() { 
     return color; 
    } 
    @Override public Color getBackgroundNonSelectionColor() { 
     return color; 
    } 
    @Override public Component getTreeCellRendererComponent(
     JTree tree, Object value, boolean selected, boolean expanded, 
     boolean leaf, int row, boolean hasFocus) { 
     JLabel l = (JLabel) super.getTreeCellRendererComponent(
      tree, value, selected, expanded, leaf, row, hasFocus); 
     if (getRowOfNode(value) == 2) { 
     l.setForeground(Color.WHITE); 
     } 
     return l; 
    } 
    } 

    public static Color getNodeColor(Object value) { 
    switch (getRowOfNode(value)) { 
    case 1: 
     return Color.RED; 
    case 2: 
     return Color.BLUE; 
    default: 
     return Color.YELLOW; 
    } 
    } 

    public static int getRowOfNode(Object value) { 
    if (value instanceof DefaultMutableTreeNode) { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
     return node.getPath().length; 
    } 
    return -1; 
    } 

    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new Main2().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+0

ty sir, das ist genau das, was ich brauchte – mayha