【发布时间】:2014-12-30 17:44:24
【问题描述】:
我想为 JTree 中的元素着色。然而,仅仅为标签添加背景颜色看起来有点奇怪。特别是如果选择了多个节点,生成的形状看起来参差不齐且分散注意力。
有没有办法让背景延伸到树元素的整个宽度,让整行都被着色?要么从左边框开始,要么从标签的开头开始,但肯定一直延伸到组件的右边框?
这是一个基于this question 的小型独立演示。
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class SO26724913 {
public static void main(String[] args) {
DefaultMutableTreeNode a = new DefaultMutableTreeNode("a");
DefaultMutableTreeNode b = new DefaultMutableTreeNode("b");
DefaultMutableTreeNode c = new DefaultMutableTreeNode("c");
a.add(b);
a.add(c);
final JTree tree = new JTree(a);
tree.setCellRenderer(new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent
(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean focus)
{
JComponent c = (JComponent)
super.getTreeCellRendererComponent
(tree, value, selected, expanded, leaf, row, focus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
String data = (String)node.getUserObject();
if ("b".equals(data)) {
c.setBackground(Color.RED);
c.setOpaque(true);
}
else {
c.setBackground(null);
c.setOpaque(false);
}
return c;
}
});
JFrame frm = new JFrame();
frm.getContentPane().add(tree);
frm.setSize(200, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}
这是代码当前生成的内容。
我更喜欢这个
或这个。
【问题讨论】:
-
如果为 super.getTreeCellRendererComponent() 返回的组件调用 setPreferredSize() 使其宽度大到足以覆盖整行怎么办?
-
@StanislavL:这在几个地方破坏了自动大小计算。覆盖
getPreferredSize而是确保照常计算高度。但是,计算整棵树的宽度将变得不可能。不过,有趣的方法可能值得回答,因此用户可以对此进行投票。 -
绝对覆盖 getPreferredSize() 更好地保持高度。仅当宽度小于 JTree 宽度以保持默认 JTree 宽度计算不变时才增加宽度也是一种明智的方法。
-
@StanislavL:由于某种原因,
tree.getWidth()在我的单元格渲染器中为零。似乎单元格被渲染为一些缓冲图像,然后计算树大小,并且单元格不再被渲染。
标签: java swing background background-color jtree