2016-07-13 8 views
2

이 질문은 this question을 기반으로합니다.JTree의 색상 행

노드가있는 레이어에 따라 트리가 다른 색으로 표시되기를 원합니다. 이 작품 잘 때 표준 groundNonSelectionColor

this is how it Looks right now

나는이 색이 JScrollPanel의 전체 폭을 커버 것을 원하는을 사용하여 메신저.

샘플 코드 :

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; 
     } 

}

참고 : 내가 패널이 전혀 아무것도 표시되지 setPreferredSize을 추가하는 경우합니다 (tree.getWidth()가 잘 작동) 와 위의 링크의 도움으로 전체 행과 텍스트 만 선택할 수있는 선택 배경을 얻을 수있었습니다.하지만 모든 행을 Color로 작업 할 수는 없습니다. Questino의 솔루션에 차이를 지정

은 위에 링크 : 질문에

이 항목을 선택하면 우리는 단지 색으로 전체 행을 연결. 내 문제는 항목이 선택되지 않은 경우 전체 행의 색상을 지정하는 것입니다 (링크 된 질문의 해결책에서 문제는 내 그림과 동일합니다!) - 항목이 선택 될 때 전체 줄이 색으로 표시됩니다. 색상을 해프닝 선택이 작동 수있는 노드/잎의 제목)

+1

링크가 당신을 위해 작동하지에서 대답은? 나는 그것이 간단한 방법이라고 생각한다. – TomN

+0

내가 연결된 질문과 내가 가진 질문 사이의 차이를 지정하기 위해 질문을 편집했습니다. – mayha

답변

3

로 감소됩니다

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

내가 필요로하는 것이 정확히 있습니다. – mayha