Use*_*123 4 java swing jtree treecellrenderer
我想为分组和未分组的节点显示单独的图标。我创建了一个自定义TreeCellRender。下面给出了我的示例代码。在for循环中,奇数一个节点有一个图标,偶数有另一个图标。但不更改节点的图标。在我的应用程序中,填充来自数据库的树节点并根据某些条件进行分组。这是一个示例可运行代码。
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("https://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("https://i.stack.imgur.com/wCF8S.png");
URL url1=new URL("https://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;
}
}
Run Code Online (Sandbox Code Playgroud)
原始代码中有一些错误,最明显的是:
我认为这更符合要求。请注意,我试图尽可能接近原始代码。我的处理方式与这里的看法不同。
String的值value以获取单元格渲染器以查看它是否包含_字符,然后拆分字符串并将最后一部分解析回整数值。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("https://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("https://i.stack.imgur.com/wCF8S.png");
URL url1 = new URL("https://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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |