Java JTree中的颜色行

Java JTree中的颜色行,java,swing,background,background-color,jtree,Java,Swing,Background,Background Color,Jtree,这个问题的基础是 我希望树的颜色根据节点所在的层而有所不同。 当我使用标准的groundNonSelectionColor 我希望这种颜色覆盖整个JSCROLL面板的宽度 示例代码: 导入java.awt.BorderLayout; 导入java.awt.Color; 导入java.awt.Component; 导入java.awt.Dimension; 导入java.awt.Rectangle; 导入javax.swing.JComponent; 导入javax.swing.JFrame;

这个问题的基础是

我希望树的颜色根据节点所在的层而有所不同。 当我使用标准的
groundNonSelectionColor

我希望这种颜色覆盖整个JSCROLL面板的宽度

示例代码:

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Rectangle;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTree;
导入javax.swing.tree.DefaultMutableTreeNode;
导入javax.swing.tree.DefaultTreeCellRenderer;
公共类主框架{
公用干管(){
JFrame f=新的JFrame();
JTree树=新的JTree();
MyTreeCellRenderer=新建MyTreeCellRenderer();
setCellRenderer(渲染器);
JScrollPane=新的JScrollPane(树);
f、 getContentPane().add(BorderLayout.CENTER,p);
f、 setVisible(真);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 设置大小(400400);
}
公共静态void main(字符串[]args){
新的Main();
}
公共静态类MyTreeCellRenderer扩展了DefaultTreeCellRenderer{
公共组件GetTreeCellRenderComponent(JTree树,对象值,布尔sel,
布尔展开、布尔叶、整型行、布尔焦点){
JComponent组件=(JComponent)super.getTreeCellRenderComponent(树、值、sel、展开、叶、行、hasFocus);
if(getRowOfNode(值)!=-1){
DefaultMutableTreeNode=(DefaultMutableTreeNode)值;
开关(getRowOfNode(值)){
//不同级别-不同颜色=>1==根
案例1:组件。立根背景(颜色。红色);断裂;
案例2:component.setBackground(颜色.蓝色);component.setForeground(颜色.白色);break;
案例3:组件。立根背景(颜色。黄色);断裂;
}                   
}
//setPreferredSize(新维度(tree.getWidth(),tree.getRowHeight());
set不透明(true);
返回组件;
}
}           
公共静态int getRowOfNode(对象值){
if(DefaultMutableTreeNode的值instanceof){
DefaultMutableTreeNode=(DefaultMutableTreeNode)值;
返回node.getPath().length;
}
返回-1;
}
}

注意: 如果我添加
setPreferredSize
面板根本没有显示任何内容(tree.getWidth()工作正常) 在上面链接的帮助下,我能够获得整行的选择背景,不仅仅是文本,但我无法使所有行的颜色都像这样

指定与上面链接的Questino解决方案的差异:

在链接整行的问题中,我们仅在选中项目时才使用颜色。我的问题是在未选择项目时给整行上色(在链接问题的解决方案中,问题与我的示例图片中相同!-整行仅在选择项目时上色-如果没有选择,颜色将减少到节点/叶的标题)

这可能会起作用:

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.tree.*;
公共类Main2{
公共JComponent makeUI(){
JTree-tree=新的颜色树2();
setCellRenderer(新的MyTreeCellRenderer());
tree.set不透明(false);
返回新的JScrollPane(树);
}
静态类ColorTree2扩展了JTree{
@替代公共零部件(图形g){
Graphics2D g2=(Graphics2D)g.create();
g2.setColor(getBackground());
g2.fillRect(0,0,getWidth(),getHeight());
对于(int i=0;i{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新Main2().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
});
}
}

链接中的答案对您无效吗?我认为这是一个简单的方法。我编辑了这个问题,以说明我所链接的问题和我所遇到的问题之间的区别,先生,这正是我所需要的
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);
    });
  }
}