gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:38 27 4
gpt4 key购买 nike

请查看 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;
}
}
}

enter image description here

最佳答案

你应该覆盖 getBackgroundNonSelectionColor , getBackgroundSelectionColorgetBackground DefaultTreeCellRenderer 并像这样返回适当的值:

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;
}
}

这将产生:

enter image description here

其他建议:

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

关于java - JTree 将节点的背景设置为非不透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14563433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com