JTree将节点背景设置为非不透明

请看一下SSCCE。 如何使未选择的树节点的背景透明。 目前,未选择节点的背景为白色。 但是,我的单元格渲染器应该将其绘制为非透明(如果未选中)(选择时为绿色……它的作用)。 最后,我希望未选择的节点只是没有背景的文本,因为SSCCE中红色的区域在我的应用程序中有一个渐变填充。

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; public class SimpleTree extends JFrame { public static void main(final String[] args) { new SimpleTree(); } public SimpleTree() { super("Creating a Simple JTree"); final Container content = this.getContentPane(); content.setBackground(Color.RED); final Object[] hierarchy = { "javax.swing", "javax.swing.border", "javax.swing.colorchooser", "javax.swing.event", "javax.swing.filechooser", new Object[] { "javax.swing.plaf", "javax.swing.plaf.basic", "javax.swing.plaf.metal", "javax.swing.plaf.multi" }, "javax.swing.table", new Object[] { "javax.swing.text", new Object[] { "javax.swing.text.html", "javax.swing.text.html.parser" }, "javax.swing.text.rtf" }, "javax.swing.tree", "javax.swing.undo" }; final DefaultMutableTreeNode root = this.processHierarchy(hierarchy); final JTree tree = new JTree(root); tree.setOpaque(false); tree.setCellRenderer(new MyCellRenderer()); final JScrollPane scroller = new JScrollPane(tree); scroller.getViewport().setOpaque(false); scroller.setOpaque(false); content.add(scroller, BorderLayout.CENTER); this.setSize(275, 300); this.setVisible(true); } /** * Small routine that will make node out of the first entry in the array, * then make nodes out of subsequent entries and make them child nodes of * the first one. The process is repeated recursively for entries that are * arrays. */ private DefaultMutableTreeNode processHierarchy(final Object[] hierarchy) { final DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]); DefaultMutableTreeNode child; for (int i = 1; i < hierarchy.length; i++) { final Object nodeSpecifier = hierarchy[i]; if (nodeSpecifier instanceof Object[]) // Ie node with children child = this.processHierarchy((Object[]) nodeSpecifier); else child = new DefaultMutableTreeNode(nodeSpecifier); // Ie Leaf node.add(child); } return (node); } public class MyCellRenderer extends DefaultTreeCellRenderer { @Override public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel, final boolean expanded, final boolean leaf, final int row, final boolean hasFocus) { final Component ret = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); final DefaultMutableTreeNode node = ((DefaultMutableTreeNode) (value)); this.setText(value.toString()); if (sel) { this.setOpaque(true); this.setBackground(Color.GREEN); } else { this.setOpaque(false); this.setBackground(null); } return ret; } } } 

在此处输入图像描述

您应该覆盖DefaultTreeCellRenderergetBackgroundSelectionColorDefaultTreeCellRenderer getBackground ,并返回适当的值,如下所示:

 public class MyCellRenderer extends DefaultTreeCellRenderer { @Override public Color getBackgroundNonSelectionColor() { return (null); } @Override public Color getBackgroundSelectionColor() { return Color.GREEN; } @Override public Color getBackground() { return (null); } @Override public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel, final boolean expanded, final boolean leaf, final int row, final boolean hasFocus) { final Component ret = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); final DefaultMutableTreeNode node = ((DefaultMutableTreeNode) (value)); this.setText(value.toString()); return ret; } } 

这将产生:

在此处输入图像描述

其他建议:

  • 在Event Dispatch Thread上创建和操作Swing组件。
  • 不要不必要地扩展JFrame而是创建一个实例并使用它。
  • 不要在JFrame上调用setSize而是使用正确的LayoutManager和/或覆盖getPreferredSize()并在JFrame上调用pack() ,然后再将其设置为可见但在添加所有组件之后。
  • 请记住使用DISPOSE_ON_CLOSEEXIT_ON_CLOSE调用JFrame#setDefaultCloseOperation DISPOSE_ON_CLOSE (除非使用Timer s,否则通常首选DISPOSE_XXX因为这将允许main(String[] args)在Gui关闭后继续执行)。

为了避免后台重新填充,只需输入UIManager.put("Tree.rendererFillBackground", false);new SimpleTree();之前new SimpleTree(); 或者在super("Creating a Simple JTree");之后super("Creating a Simple JTree");