[英]How to set Jtree node icon dynamically
我想為分組和未分組的節點顯示單獨的圖標。我創建了一個customTreeCellRender.My示例代碼如下所示。在for循環奇數中,一個節點有一個圖標,而evens有另一個。但是不能更改節點的圖標。在我的應用程序中,填充來自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;
}
}
原始代碼中存在一些錯誤,最明顯的是:
我認為這更符合要求。 請注意,我試圖盡可能接近原始代碼。 我會在這里以不同的方式看待它。
value
的String
值,以使單元格渲染器查看它是否包含_
字符,然后拆分字符串並將最后一部分解析回整數值。 Integer
對象。 在單元格渲染器中,檢查值是Integer
的實例,如果是,則在數字前加上node_
.. import java.awt.*;
import java.net.*;
import javax.swing.*;
import javax.swing.tree.*;
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();
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);
tree.setCellRenderer(new CustomIconRenderer());
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
DefaultMutableTreeNode subroot = new DefaultMutableTreeNode(
"node_" + i);
root.add(subroot);
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);
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;
public CustomIconRenderer() throws MalformedURLException {
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();
String s = nodeObj.toString();
System.out.println("s: " + s);
boolean includesUnderscore = s.indexOf("_") > 0;
if (includesUnderscore) {
String lastPart = s.split("_")[1];
int num = Integer.parseInt(lastPart);
// check whatever you need to on the node user object
if (num % 2 == 0) {
setIcon(unGroupedIcon);
} else {
System.out.println("reached");
setIcon(groupedIcon);
}
}
return this;
}
}
我創建了一個customTreeCellRender.But沒有更改圖標
您不需要直接調用getTreeCellRendererComponent
,而是讓JTree通過顯式設置JTree
的TreeCellRenderer
來處理它,如Oracle教程中所述。
tree.setCellRenderer(customIconRenderer);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.