2016-07-13 6 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()が正常に動作している) と上記のリンクの助けを借りて、テキストだけでなく、行全体にわたって選択の背景を得ることができましたが、そのようにすべての行を色付けすることはできません。 Questinoのソリューションとの違いを指定

は、上記のリンク:質問で

は、項目が選択されている場合、我々は唯一の着色されて行全体をリンク。私の問題は、アイテムが選択されていないときに行全体を色づけることです(リンクされた質問の解決法では問題は私の例のPictureと同じです) - アイテムが選択されたときには、色ハプニング選択は、ノード/葉のタイトルに削減されます)

+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

関連する問題