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; } } }
您应该覆盖DefaultTreeCellRenderer
, getBackgroundSelectionColor
和DefaultTreeCellRenderer
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_CLOSE
或EXIT_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");
。