【发布时间】:2015-07-23 09:16:36
【问题描述】:
我想为分组和未分组的节点显示单独的图标。我创建了一个 customTreeCellRender。下面给出了我的示例代码。在 for 循环中,奇数的一个节点有一个图标,偶数有另一个。但不要更改节点的图标。在我的应用程序,从 db 填充树节点并根据某些条件进行分组。这是一个示例可运行代码。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
public class TestTree extends JDialog {
JTree tree;
DefaultTreeModel treeModel;
public TestTree() {
setSize(300, 800);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
System.out.println(getContentPane().getBackground());
}
protected static ImageIcon createImageIcon(String path) throws MalformedURLException {
java.net.URL imgURL = new URL(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
public void init() throws MalformedURLException {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Numbers");
treeModel = new DefaultTreeModel(root);
tree = new JTree(treeModel);
tree.setBackground(new Color(238, 238, 244));
tree.setOpaque(true);
CustomIconRenderer customIconRenderer = new CustomIconRenderer(true);
customIconRenderer.setTextSelectionColor(Color.white);
customIconRenderer.setBackgroundSelectionColor(Color.blue);
customIconRenderer.setBorderSelectionColor(Color.black);
customIconRenderer.setBackgroundNonSelectionColor(new Color(238, 238,
244));
ImageIcon icon = createImageIcon("http://i.stack.imgur.com/wCF8S.png");
customIconRenderer.setLeafIcon(icon);
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
DefaultMutableTreeNode subroot = new DefaultMutableTreeNode(
"node_" + i);
root.add(subroot);
tree.setCellRenderer(new CustomIconRenderer(false));
if (i % 3 == 0) {
for (int j = 10; j < 15; j++) {
DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(
"node_" + j);
subroot.add(leaf);
}
}
} else {
DefaultMutableTreeNode subroot = new DefaultMutableTreeNode(
"node_" + i);
root.add(subroot);
tree.setCellRenderer(new CustomIconRenderer(true));
if (i % 4 == 0) {
for (int j = 15; j < 20; j++) {
DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(
"node_" + j);
subroot.add(leaf);
}
}
}
}
for (int i = 0; i < tree.getRowCount(); i++) {
tree.expandRow(i);
}
tree.setCellRenderer(customIconRenderer);
getContentPane().add(tree, BorderLayout.CENTER);
}
public static void main(String args[]) throws MalformedURLException {
TestTree tt = new TestTree();
tt.init();
tt.setVisible(true);
}
}
class CustomIconRenderer extends DefaultTreeCellRenderer {
/**
*
*/
private static final long serialVersionUID = 967937360839244309L;
ImageIcon groupedIcon;
ImageIcon unGroupedIcon;
boolean grouped;
public CustomIconRenderer() {
}
public CustomIconRenderer(boolean grouped) throws MalformedURLException {
this.grouped = grouped;
URL url=new URL("http://i.stack.imgur.com/wCF8S.png");
URL url1=new URL("http://i.stack.imgur.com/T5uTa.png");
groupedIcon = new ImageIcon(url1
);
unGroupedIcon = new ImageIcon(url
);
}
@Override
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);
Object nodeObj = ((DefaultMutableTreeNode) value).getUserObject();
// check whatever you need to on the node user object
if (grouped) {
setIcon(unGroupedIcon);
} else {
System.out.println("reached");
setIcon(groupedIcon);
}
return this;
}
}
【问题讨论】:
-
添加了可运行的正确示例
-
1) MCVE 需要是一个源文件(可以包含多个非公共类)并包含导入。 2) 如果没有您 PC 上的图像文件,我们将无法运行它并查看问题!例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。
-
加一个用于添加 MCVE。我正在尝试重新开放,但仍需要另外两张公开投票。同时,将
public Component getTreeCellRendererComponent(..更改为@Override public Component getTreeCellRendererComponent(..以显示编译器消息。 -
“在 for 循环中,奇数一个节点有一个图标,偶数有另一个。” 好的。你所说的“奇怪”到底是什么意思?他们是那些文本以奇数结尾的吗?添加节点时,奇数是“每隔一个”吗?还有什么..?
-
奇数文本以奇数结尾的文本
标签: java swing jtree treecellrenderer