JTree orgTree;
    DefaultMutableTreeNode root,child;
    DefaultTreeModel model;
    root=new DefaultMutableTreeNode("root");
    orgTree=new JTree(root);
    model=(DefaultTreeModel)orgTree.getModel();
    child=new DefaultMutableTreeNode("字节点");
    model.insertNodeInto(child,root,0);
问怎么改变“字节点”的颜色?

解决方案 »

  1.   

    有这几个关于改变颜色的类,你试试看
    setTextNonSelectionColor(Color)
    setTextSelectionColor(Color)
      

  2.   

    改变背景颜色是:
    setBackgroundNonSelectionColor(Color)
    setBackgroundSelectionColor(Color)
      

  3.   

    具体该怎么用,我不是想只是选中它才改变颜色,而是为每个节点设置个标志位,这个标志位为true时,设置为一种颜色,为false时设置为另一种颜色。
      

  4.   

    同过实现TreeCellRenderer可以设置,选中的,叶子的颜色
    下面是一个例子,我的程序用到的,希望对你有帮助。
    class CellRender extends JLabel
        implements TreeCellRenderer {
      protected Color selectedBackground;
      protected Color selectedForeground;
      protected Color noselectedBackground;
      protected Color noselectedForeground;
      protected Color overflowBackground = Color.yellow;
      protected Color overflowForeground = Color.red;
      protected Color overflowSelectedBG = Color.green;
      protected Color overflowSelectedFG = Color.black;
      public CellRender()
      {
        super();
        this.selectedBackground = Color.blue;
        this.selectedForeground = Color.green;
        this.noselectedBackground = Color.white;
        this.noselectedForeground = Color.blue;
        this.setForeground(this.noselectedForeground);
        this.setBackground(this.noselectedBackground);
      }
      /**
       * Sets the value of the current tree cell to <code>value</code>.
       *
       * @return the <code>Component</code> that the renderer uses to draw the value
       * @param tree JTree
       * @param value Object
       * @param selected boolean
       * @param expanded boolean
       * @param leaf boolean
       * @param row int
       * @param hasFocus boolean
       * @todo Implement this javax.swing.tree.TreeCellRenderer method
       */
      public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                    boolean selected,
                                                    boolean expanded, boolean leaf,
                                                    int row, boolean hasFocus) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
        NodeData nd ;       if(leaf)
          {
              nd = (NodeData) node.getUserObject();        
          }
          else
          {
              int count = node.getChildCount();
              NodeData childData = null;
              for(int i = 0 ; i < count ; i++)
              {
                DefaultMutableTreeNode child =
                    (DefaultMutableTreeNode) node.getChildAt(i);
                    childData = (NodeData) child.getUserObject();
                    if(childData.isOverflow())
                      break;
              }
              nd = childData;
          }
          if (!nd.isOverflow()) {
              if (selected) 
              {
                this.setForeground(this.selectedForeground);
                this.setBackground(this.selectedBackground);
              }
              else 
              {
                this.setBackground(this.noselectedBackground);
                this.setForeground(this.noselectedForeground);
              }
            }
            else {
              if(selected)
              {
                this.setBackground(this.overflowSelectedBG); 
                this.setForeground(this.overflowSelectedFG);
              }
              else
              {
                this.setBackground(this.overflowBackground);
                this.setForeground(this.overflowForeground);
              }
            }
          
          this.setText(nd.toString());
        return this;
      }}
      

  5.   

    然后使用JTree
    的setCellRenderer()方法就行了
      

  6.   

    回复人: jackkui(键 之 舞 者) ( ) 信誉:99  还没有看,就知道你太强了!佩服
    不过, 楼主,字体是没有颜色 这一概念的,所谓字体的颜色,实际是背景,或前景颜色.
      

  7.   

    简单的说,就是在Renderer里面判断一下,节点属性符合你的条件的就设置:
    setForeground(Color);节点属性的判断可以通过对Object value进行判断:    class NodeRenderer extends DefaultTreeCellRenderer
        {
            public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                          boolean selected, boolean expanded,
                                                          boolean leaf, int row, boolean hasFocus)
            {
                super.getTreeCellRendererComponent(tree, value,
                                                   selected, expanded,
                                                   leaf, row, hasFocus);
                MyTreeNode node = (MyTreeNode)value;
                if(...) //条件满足
                {
                    setForeground(Color.RED);
                }
                return this;
            }
        }然后设置树的Renderer:
    jTree.setCellRenderer(new NodeRenderer());
      

  8.   

    marcien(阿火) :您好!
                if(...) //条件满足
                {
                    setForeground(Color.RED);
                }
                return this;
            }
    您的这部分代码,我还是不太明白.如果我要将我选中的树节点的颜色变成red,我的这部分代码该怎么写呢.下面是选择树节点后的触发事件,这两部分代码该怎么结合呢.请您进一步指导一下.
     public void valueChanged(TreeSelectionEvent e) {
          JTree tree = (JTree) e.getSource();
          DefaultMutableTreeNode selectionNode =
              (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
          String nodeName = selectionNode.toString();
      
          //tree的click事件
          if (nodeName.equals("011")) {
            
          
                                      }
        }
      

  9.   

    我上面写的那段代码是树的渲染器,不是放在树选择触发器中的代码。
    比如你最后贴的这段代码里面,你需要nodeName.equals("011")的树节点是红色,那么你需要在树的触发器里面写:    class NodeRenderer extends DefaultTreeCellRenderer
        {
            public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                          boolean selected, boolean expanded,
                                                          boolean leaf, int row, boolean hasFocus)
            {
                super.getTreeCellRendererComponent(tree, value,
                                                   selected, expanded,
                                                   leaf, row, hasFocus);
                DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
                if(node.getUserObject().toString().trim().equals("011")) //条件满足
                {
                    setForeground(Color.RED);
                }
                return this;
            }
        }
    然后在你的生成树之后给树加上渲染器,比如下面这个例子:import java.awt.*;
    import java.awt.event.*;import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;public class SimpleTree extends JFrame
    {
        JPanel contentPane;
        JScrollPane scrollPane = new JScrollPane();
        MyTree tree = new MyTree();
        DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
        NodeRenderer renderer = new NodeRenderer();
        private TreeMouseHandler treeMouseListener = new TreeMouseHandler();    //Constructor
        public SimpleTree()
        {
            enableEvents(AWTEvent.WINDOW_EVENT_MASK);
            try
            {
                jbInit();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }    //Component initialization
        private void jbInit() throws Exception
        {
            tree.setEditable(false);
            tree.setShowsRootHandles(true);
            tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            tree.setExpandsSelectedPaths(true);
            tree.addMouseListener(treeMouseListener);
            tree.setCellRenderer(renderer);
            tree.addTreeExpansionListener(new TreeExpansionListener()
            {
                public void treeCollapsed(TreeExpansionEvent evt)
                {
                }            public void treeExpanded(TreeExpansionEvent evt)
                {
                }
            });        contentPane = (JPanel) this.getContentPane();
            this.setTitle("MyFrame");
            scrollPane.getViewport().add(tree, null);
            contentPane.add(scrollPane, BorderLayout.CENTER);
        }    //Overridden so we can exit when window is closed
        protected void processWindowEvent(WindowEvent e)
        {
            super.processWindowEvent(e);
            if (e.getID() == WindowEvent.WINDOW_CLOSING)
            {
                System.exit(0);
            }
        }    public static void main(String[] args)
        {
            SimpleTree simpleTree = new SimpleTree();
            simpleTree.setSize(800,600);
            simpleTree.show();
        }    private class TreeMouseHandler extends MouseAdapter
        {
            public void mousePressed(MouseEvent e)
            {
                if(SwingUtilities.isLeftMouseButton(e) == false)
                {
                    return;
                }
                System.out.println("mousePressed");
            }        public void mouseClicked(MouseEvent e)
            {
                if((SwingUtilities.isLeftMouseButton(e) == false))
                {
                    return;
                }
                TreePath[] selectedPaths = tree.getSelectionPaths();
                if((selectedPaths == null) || (selectedPaths.length == 0))
                {
                    return;
                }
                if(selectedPaths.length == 1)
                {
                    if(e.getClickCount() == 1)
                    {
                        System.out.println("mouseClicked: left button * 1 : " + selectedPaths[0]);
                    }
                    else if(e.getClickCount() == 2)
                    {
                        System.out.println("mouseClicked: left button * 2 : " + selectedPaths[0]);
                    }
                }
            }
        }    class MyTree extends JTree
        {
            public MyTree()
            {
                DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("root");
                DefaultMutableTreeNode sub1Node = 
                new DefaultMutableTreeNode("sub1");
                rootNode.add(sub1Node);            DefaultMutableTreeNode n =
                new DefaultMutableTreeNode("011");
                sub1Node.add(n);
                n.add(new DefaultMutableTreeNode("111"));
                n.add(new DefaultMutableTreeNode("112"));
                n.add(new DefaultMutableTreeNode("113"));            n = new DefaultMutableTreeNode("012");
                sub1Node.add(n);
                n.add(new DefaultMutableTreeNode("121"));
                n.add(new DefaultMutableTreeNode("122"));
                n.add(new DefaultMutableTreeNode("123"));
        
                this.setModel(new DefaultTreeModel(rootNode));
            }
        }
        class NodeRenderer extends DefaultTreeCellRenderer
        {
            public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                          boolean selected, boolean expanded,
                                                          boolean leaf, int row, boolean hasFocus)
            {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
                super.getTreeCellRendererComponent(tree, value,
                                                   selected, expanded,
                                                   leaf, row, hasFocus);
                if(node.getUserObject().toString().trim().equals("011"))
                {
                    setForeground(Color.RED);
                }
                return this;
            }
        }}