java jtree空指针_java-如何为JTree单元设置透明背景?

伙计们,

我正在尝试创建一个渐变JTree控件.除了树单元格的背景不是透明的以外,以下代码大部分可用.如果有人打电话告诉我我做错了什么,我将不胜感激.

预先感谢您的帮助.

问候,

彼得

package TestPackage;

import javax.swing.*;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.DefaultTreeCellRenderer;

import java.awt.*;

public class Test {

public Test() {

JFrame frame = new JFrame();

JPanel framePanel = new JPanel();

framePanel.setLayout(new BorderLayout());

frame.setContentPane(framePanel);

DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Item");

DefaultMutableTreeNode childNode = new DefaultMutableTreeNode("Child");

rootNode.add(childNode);

GradientTree tree = new GradientTree(rootNode);

// JTree tree = new JTree(rootNode);

// tree.setBackground(Color.blue);

tree.setCellRenderer(new MyRenderer());

JScrollPane scroll = new JScrollPane(tree);

scroll.setOpaque(false);

framePanel.add(scroll, BorderLayout.CENTER);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

new Test();

}

});

}

@SuppressWarnings("serial")

public static class GradientTree extends JTree {

public GradientTree(DefaultMutableTreeNode node) {

super(node);

}

@Override

protected void paintComponent(Graphics g) {

int h = getHeight();

int w = getWidth();

GradientPaint gradientPaint = new GradientPaint(0, 0, Color.LIGHT_GRAY, 0, h, Color.WHITE);

Graphics2D g2D = (Graphics2D) g;

g2D.setPaint(gradientPaint);

g2D.fillRect(0, 0, w, h);

this.setOpaque(false);

super.paintComponent(g);

this.setOpaque(true);

}

}

@SuppressWarnings({"serial" })

private class MyRenderer extends DefaultTreeCellRenderer {

public MyRenderer() {

this.setOpaque(false);

this.setForeground(Color.RED);

}

public Component getTreeCellRendererComponent(

JTree tree,

Object value,

boolean sel,

boolean expanded,

boolean leaf,

int row,

boolean hasFocus) {

super.getTreeCellRendererComponent(

tree, value, sel,

expanded, leaf, row,

hasFocus);

return this;

}

}

}

解决方法:

这是一个真正的痛苦. DefaultTreeCellRenderer将忽略不透明值,并始终填充其内容.但是,有一个标志可以尝试.我过去做过,但是没有时间进行测试…

尝试UIManager.put(“ Tree.rendererFillBackground”,false).在任何东西都成为渲染器之前,但在应用任何外观设置之后,请尝试执行此操作.

更新

在创建任何树之前,设置此属性非常重要

没有|随着…

public class TestTreeRenderer {

public static void main(String[] args) {

new TestTreeRenderer();

}

public TestTreeRenderer() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JFrame frame = new JFrame("Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new TreePane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class TreePane extends JPanel {

private JTree tree;

public TreePane() {

// THIS IS VERY IMPORTANT

// You must set this BEFORE creating ANY trees!!

UIManager.put("Tree.rendererFillBackground", false);

setLayout(new BorderLayout());

tree = new JTree();

tree.setBackground(Color.BLUE);

System.out.println("Loading files...");

File root = new File("/etc");

DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(root.getName());

for (File file : root.listFiles()) {

rootNode.add(new DefaultMutableTreeNode(file.getName()));

}

System.out.println("Loading model");

DefaultTreeModel model = new DefaultTreeModel(rootNode);

tree.setModel(model);

add(new JScrollPane(tree));

}

}

}

标签:jtree,renderer,java,transparency,swing

来源: https://codeday.me/bug/20191014/1911551.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值