如何为JTree设置不同的节点图标? hexiaofeng你的意思是不是取消它原来的图标,然后,在加入的JLabel中设置不同的图标,加入?有道理,我回去试试,也许真是这种解决方式了:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是的,扩展JLabel实现TreeCellRenderer,然后作为DefaultMutableTreeNode的参数就可以了。如果扩展别的组件就可以实现更复杂的功能,呵呵。 我的代码package untitled5;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.tree.*;public class Frame1 extends JFrame{ JPanel contentPane; ImageIcon imageicona = new ImageIcon("10-1.jpg"); ImageIcon imageiconb = new ImageIcon("10-2.jpg"); ImageIcon imageiconc = new ImageIcon("10-3.jpg"); BorderLayout borderLayout1 = new BorderLayout(); JPanel jPanel1 = new JPanel(); JPanel jPanel2 = new JPanel(); JScrollPane jScrollPane1 = new JScrollPane(); BorderLayout borderLayout2 = new BorderLayout(); JLabel jLabel1 = new JLabel("A",imageicona,JLabel.LEFT); JLabel jLabel2 = new JLabel("B",imageiconb,JLabel.LEFT); JLabel jLabel3 = new JLabel("C",imageiconc,JLabel.LEFT); //JLabel [][] j = {{jLabel1,jLabel2,jLabel3},{jLabel2}}; JTree jTree1 = new JTree(getD()); //Construct the frame public Frame1() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } //Component initialization private void jbInit() throws Exception { //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Your Icon]"))); contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("Frame Title"); jPanel2.setLayout(borderLayout2); /* jLabel1.setText("jLabel1"); jLabel2.setText("jLabel2",imageiconb,JLabel.LEFT); jLabel3.setText("jLabel3",imageiconc,JLabel.LEFT); */ contentPane.add(jPanel1, BorderLayout.NORTH); jPanel1.add(jLabel3, null); jPanel1.add(jLabel2, null); jPanel1.add(jLabel1, null); contentPane.add(jPanel2, BorderLayout.CENTER); jPanel2.add(jScrollPane1, BorderLayout.CENTER); jScrollPane1.getViewport().add(jTree1, null); MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer(); // renderer.setLeafIcon(imageiconc); jTree1.setCellRenderer(renderer); } //Overridden so we can exit when window is closed protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } private TreeModel getD() { DefaultMutableTreeNode root = new DefaultMutableTreeNode("A"); DefaultMutableTreeNode p,q; p = new DefaultMutableTreeNode("B"); q = new DefaultMutableTreeNode("C"); q.add(new DefaultMutableTreeNode("D")); root.add(p); root.add(new DefaultMutableTreeNode("X")); p.add(q); return new DefaultTreeModel(root); }}package untitled5;import javax.swing.*;import javax.swing.tree.*;import javax.swing.tree.DefaultTreeCellRenderer;import java.awt.Component;import javax.swing.tree.DefaultTreeModel;public class MyDefaultTreeCellRenderer extends DefaultTreeCellRenderer{ public MyDefaultTreeCellRenderer() { } public static void main(String[] args) { MyDefaultTreeCellRenderer myDefaultTreeCellRenderer1 = new MyDefaultTreeCellRenderer(); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; // node.setIcon(new ImageIcon("10-1.jpg")); /* String tmp = node.toString(); System.out.println(row); if (tmp.equals("A")) this.setIcon(new ImageIcon("10-1.jpg")); else if (tmp.equals("B")) this.setIcon(new ImageIcon("10-2.jpg")); else if (tmp.equals("C")) this.setIcon(new ImageIcon("10-3.jpg")); else if (tmp.equals("D")) this.setIcon(new ImageIcon("10-1.jpg")); */ switch(node.getLevel() ) { case 0 : this.setIcon(new ImageIcon("10-1.jpg")); break; case 1 : this.setIcon(new ImageIcon("10-2.jpg")); break; case 2 : this.setIcon(new ImageIcon("10-3.jpg")); break; } return this; }}可以实现你的要求不是到是不是最好的方法你的想法呢?? 所见略同,我昨晚也弄出来了:)其实就是setIcon即可,因为DefaultTreeCellRenderer类本身就是extendsJLabel来的,所以很简单了……给分了。 请教各位一个关于interface代码 如何一行一行的向一个JPanel中加入另外一个Jpanel 而不是紧接在后面 java gui得问题,麻烦各位看看 JSF 电子书 有关properties输入流的问题 救命啊!!! 这么解释多态可以吗? (超级简单)关于 http://localhost:8080/ 关于MaskFormatter的错误 Java Application能不能在安装了JVM但没有装SDK的系统中运行? ***用JAVA写了一个'搬运工'游戏,画图的时候遇到了点问题,请进! Could SSL be used to SMTP???
package untitled5;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;public class Frame1 extends JFrame
{ JPanel contentPane;
ImageIcon imageicona = new ImageIcon("10-1.jpg");
ImageIcon imageiconb = new ImageIcon("10-2.jpg");
ImageIcon imageiconc = new ImageIcon("10-3.jpg");
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JScrollPane jScrollPane1 = new JScrollPane();
BorderLayout borderLayout2 = new BorderLayout(); JLabel jLabel1 = new JLabel("A",imageicona,JLabel.LEFT);
JLabel jLabel2 = new JLabel("B",imageiconb,JLabel.LEFT);
JLabel jLabel3 = new JLabel("C",imageiconc,JLabel.LEFT);
//JLabel [][] j = {{jLabel1,jLabel2,jLabel3},{jLabel2}};
JTree jTree1 = new JTree(getD()); //Construct the frame
public Frame1()
{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception
{
//setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Your Icon]")));
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(400, 300));
this.setTitle("Frame Title");
jPanel2.setLayout(borderLayout2);
/*
jLabel1.setText("jLabel1");
jLabel2.setText("jLabel2",imageiconb,JLabel.LEFT);
jLabel3.setText("jLabel3",imageiconc,JLabel.LEFT);
*/
contentPane.add(jPanel1, BorderLayout.NORTH);
jPanel1.add(jLabel3, null);
jPanel1.add(jLabel2, null);
jPanel1.add(jLabel1, null);
contentPane.add(jPanel2, BorderLayout.CENTER);
jPanel2.add(jScrollPane1, BorderLayout.CENTER);
jScrollPane1.getViewport().add(jTree1, null); MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer();
// renderer.setLeafIcon(imageiconc);
jTree1.setCellRenderer(renderer); }
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING)
{
System.exit(0);
}
} private TreeModel getD()
{
DefaultMutableTreeNode root = new DefaultMutableTreeNode("A");
DefaultMutableTreeNode p,q;
p = new DefaultMutableTreeNode("B");
q = new DefaultMutableTreeNode("C");
q.add(new DefaultMutableTreeNode("D")); root.add(p);
root.add(new DefaultMutableTreeNode("X"));
p.add(q); return new DefaultTreeModel(root); }
}package untitled5;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.awt.Component;
import javax.swing.tree.DefaultTreeModel;public class MyDefaultTreeCellRenderer extends DefaultTreeCellRenderer
{ public MyDefaultTreeCellRenderer()
{
}
public static void main(String[] args)
{
MyDefaultTreeCellRenderer myDefaultTreeCellRenderer1 = new MyDefaultTreeCellRenderer();
} public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
{
super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
// node.setIcon(new ImageIcon("10-1.jpg"));
/*
String tmp = node.toString();
System.out.println(row);
if (tmp.equals("A"))
this.setIcon(new ImageIcon("10-1.jpg"));
else if (tmp.equals("B"))
this.setIcon(new ImageIcon("10-2.jpg"));
else if (tmp.equals("C"))
this.setIcon(new ImageIcon("10-3.jpg"));
else if (tmp.equals("D"))
this.setIcon(new ImageIcon("10-1.jpg"));
*/
switch(node.getLevel() )
{
case 0 : this.setIcon(new ImageIcon("10-1.jpg"));
break;
case 1 : this.setIcon(new ImageIcon("10-2.jpg"));
break;
case 2 : this.setIcon(new ImageIcon("10-3.jpg"));
break; }
return this;
}}可以实现你的要求不是到是不是最好的方法
你的想法呢??