2017-09-18 4 views
0

私のアプリケーション用にJTreeを作成しました。今私はいくつかのノードの色や完全な木自体の色を変更したい。私は検索し、カスタムTreeCellRendererComponentを作成し、その中の色を更新することが判明しましたが、それは私のためには機能しません。たぶん私は何かが不足しているか、または私が考えていることは、色を変えないJTreeの特定のプロパティを更新している可能性があります。JFrameでJTreeの色が変更されない

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Font; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTree; 
import javax.swing.border.EmptyBorder; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.DefaultTreeModel; 

public class TestClass2 extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        TestClass2 frame = new TestClass2(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public TestClass2() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(new BorderLayout()); 
     contentPane.add(prepareCommandTree(), BorderLayout.CENTER); 
    } 


    public static JTree prepareCommandTree() 
    { 
     // Root node name which is the name of the command e.g. Display Text 
     DefaultMutableTreeNode commandNode = new DefaultMutableTreeNode("Command Name"); 
     DefaultMutableTreeNode completeData = new DefaultMutableTreeNode("Complete Data"); 

     // Adding all branches under root branch 
     commandNode.add(completeData); 

     //create the tree by passing in the root node 
     JTree commandTree = new JTree(commandNode); 
     DefaultTreeModel model = (DefaultTreeModel)commandTree.getModel(); 
     DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
     model.reload(root); 

     // Setting JTree background 
     commandTree.setOpaque(false); 
     commandTree.collapseRow(0); 
     commandTree.setBorder(new EmptyBorder(5, 0, 0, 0)); 
     commandTree.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 13)); 

     // Adding image icon to the tree 
     commandTree.setCellRenderer(new DefaultTreeCellRenderer(){ 
     private static final long serialVersionUID = 1L; 

     public Component getTreeCellRendererComponent(final JTree tree,Object value, 
      boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus) 
     { 
      // Trying to change color of tree 
      setForeground(Color.RED); 
      JLabel label = (JLabel)super.getTreeCellRendererComponent(tree,value, 
                sel,expanded,leaf,row,hasFocus); 
       return label; 
     } 
     }); 

     // Setting adjustments to JTree properties 
     commandTree.putClientProperty("JTree.lineStyle", "None"); 
     commandTree.setAlignmentX(Component.LEFT_ALIGNMENT); 
     DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) commandTree.getCellRenderer(); 
     renderer.setLeafIcon(null); 
     renderer.setClosedIcon(null); 
     renderer.setOpenIcon(null); 

     return commandTree; 
    } 
} 

どのような示唆/修正が役に立ちます。ありがとう。 :-)

答えて

5

レンダラーが前景を設定しますColorの前にsuper呼び出しが実行されました。

superメソッドでは、前景セットColorも設定したものと置き換えられます。

の呼び出しのあとにColorを適用してください。

public Component getTreeCellRendererComponent(final JTree tree, final Object value, 
      final boolean sel, final boolean expanded, final boolean leaf, final int row, 
      final boolean hasFocus) { 
     // Trying to change color of tree 

     JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, 
       sel, expanded, leaf, row, hasFocus); 
     setForeground(Color.RED); 
     return label;// Or "return this", since the method actually returns the renderer component itself 
    } 
}); 
+2

説明: 'super.getTCRC ...(...)'は 'this'を返します。これはJLabelです。 'label.setForeground(Color.RED);'はもっと明確になります。 –

+0

ソリューションのためのBergerに感謝し、もっと重要なのはその理由です。 :-) – Aman

+0

そしてもっと明確にするための@JoopEggenに感謝します:) – Berger

関連する問題