首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

JTree节点平添图片

2012-09-03 
JTree节点添加图片怎么给节点添加图片上去?[解决办法]参考 http://www.javaeye.com/topic/335127[解决办法

JTree节点添加图片
怎么给节点添加图片上去?

[解决办法]
参考 http://www.javaeye.com/topic/335127
[解决办法]
看看这个:

Java code
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.util.*;
import java.io.*;
//定义该类继承自JFrame
public class Sample25_2 extends JFrame
{
//创建并初始化工具栏中的工具按扭数组
private JButton[] jbBar={new JButton("添加"),new JButton("删除")};
//创建工具栏
private JToolBar jtb=new JToolBar();
//创建用来显示情况的文本框
private JTextField jtf=new JTextField();
//创建根节点
private DefaultMutableTreeNode dmtnRoot=new DefaultMutableTreeNode("目录");
//创建树的数据模型
private DefaultTreeModel dtm=new DefaultTreeModel(dmtnRoot);
//创建树状列表控件
private JTree jt=new JTree(dtm);
//为树状列表创建滚动窗口
private JScrollPane jsp=new JScrollPane(jt);
//用来记录当前选中节点的成员变量
private DefaultMutableTreeNode tempNode;
//创建弹出式菜单
private JPopupMenu jpm=new JPopupMenu();
//创建菜单项数组
private JMenuItem[] jmi={new JMenuItem("定义非叶子节点展开图标"),
new JMenuItem("定义非叶子节点折叠图标"),new JMenuItem("定义叶子节点图标")};
//用来作为树相关事件监听器的内部类
private class MyTreeListener implements TreeExpansionListener,
TreeModelListener,TreeSelectionListener
{
//定义用来记录路径的节点数组
private Object[] tempNodes;
//创建StringBuffer对象
private StringBuffer tempMsg=new StringBuffer();
//声明用来记录路径TreePath
private TreePath tp;
//处理选中某节点后发生事件的方法
public void valueChanged(TreeSelectionEvent tse)
{
//获得根节点到选中节点的路径
tp=tse.getNewLeadSelectionPath();
if(tp!=null)
{
//从路径中获得所有路径中的节点
tempNodes=tp.getPath();
//循环对路径中的每个节点进行处理
for(int i=0;i <tempNodes.length;i++)
{
//将各个节点的内容连接起来并添加到StringBuffer中
tempMsg.append(tempNodes[i]);
if(i!=tempNodes.length-1)
{//在各个节点中间添加“>>”符号
tempMsg.append(">>");
}
}
//在文本框中显示相应的信息
jtf.setText("您选择了:“"+tempMsg.toString()+"”节点!!!");
//删除StringBuffer中的所有内容
tempMsg.delete(0,tempMsg.length());
//记录选中的节点
tempNode=(DefaultMutableTreeNode)tp.getLastPathComponent();
}
}
//处理节点折叠后发生事件的方法
public void treeCollapsed(TreeExpansionEvent tee)
{
//获得根节点到选中节点的路径
tp=tee.getPath();
//设置文本框显示相应的信息
jtf.setText("您将"+tp.getLastPathComponent()+"节点折叠了!!!");
}
//处理节点展开后发生事件的方法
public void treeExpanded(TreeExpansionEvent tee)
{
//获得根节点到选中节点的路径
tp=tee.getPath();
//设置文本框显示相应的信息
jtf.setText("您将“"+tp.getLastPathComponent()+"”节点展开了!!!");
}
//处理当节点名称更改之后发生事件的方法
public void treeNodesChanged(TreeModelEvent tme)
{
//设置文本框显示节点名称更改信息
jtf.setText("您将节点的标题修改了!!!");
}
//以下三个方法由于本例中没有使用,所以均为空实现
public void treeStructureChanged(TreeModelEvent tme){}
public void treeNodesRemoved(TreeModelEvent tme){}
public void treeNodesInserted(TreeModelEvent tme){}
}
//用来作为工具栏中按钮动作事件监听器的内部类
class MyToolBarButtonListener implements ActionListener
{
//实现ActionListener监听接口中的方法
public void actionPerformed(ActionEvent e)
{
//点击添加按扭执行的动作
if(e.getSource()==jbBar[0])
{
//检查是否有选中节点
if(tempNode==null)
{
JOptionPane.showMessageDialog(Sample25_2.this,


"请您选择添加节点所在的目录!!!","错误"
,JOptionPane.WARNING_MESSAGE);
return;
}
//判断节点是否为代表“节”的节点
if(tempNode.getLevel()==2)
{
JOptionPane.showMessageDialog(Sample25_2.this,
"对不起,“节”节点不能添加子节点!!!","错误"
,JOptionPane.WARNING_MESSAGE);
return;
}
//弹出输入对话框,要求输入节点名称
String tempName=JOptionPane.showInputDialog(Sample25_2.this,
"请输入添加节点的名称","请输入:",JOptionPane.INFORMATION_MESSAGE);
//检查输入内容是否为null
if(tempName==null)
{
return;//若为null方法返回
}
//去除输入内容两端的不可见字符
tempName=tempName.trim();
//检查输入的字符串是否为空字符串
if(tempName.equals(""))
{
return;//若为空字符串则方法返回
}
//弹出输入对话框,要求输入节点的位置
String tempID=JOptionPane.showInputDialog(Sample25_2.this,
"请输入(例如第一个节点的编号为1):","请输入添加节点的编号",
JOptionPane.INFORMATION_MESSAGE);
//检查输入内容是否为null
if(tempID==null)
{
return;//若为null方法返回
}
//去除输入内容两端的不可见字符
tempID=tempID.trim();
//检查输入的字符串是否满足指定的格式要求
if(!tempID.matches("[1-9][0-9]*"))
{
JOptionPane.showMessageDialog(Sample25_2.this,
"输入数字格式无效!!!","错误",JOptionPane.WARNING_MESSAGE);
return;
}
//将输入的字符串转换为数值
int id=Integer.parseInt(tempID);
//检查数值是满足范围要求
if(id <1||id>tempNode.getChildCount()+1)
{
JOptionPane.showMessageDialog(Sample25_2.this,
"输入数字过大或太小!!!","错误",JOptionPane.WARNING_MESSAGE);
return;
}
//创建新节点
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(tempName);
//将新节点插入到指定位置
tempNode.insert(newNode,id-1);
//更新树的数据模型
((DefaultTreeModel)jt.getModel()).reload(tempNode);
//设置维持当前的选择路径
jt.setExpandsSelectedPaths(true);
//设置文本框中的提示信息
jtf.setText("您在"+tempNode+"中添加了"+newNode+"节点!!!");
}
else if(e.getSource()==jbBar[1])
{//点击删除按扭执行的动作
//检查当前是否选中了某节点
if(tempNode==null)
{
JOptionPane.showMessageDialog(Sample25_2.this,
"请您选择要删除的节点!!!","错误",JOptionPane.WARNING_MESSAGE);
return;
}
//确认是否要删除选中的节点
int confirm=JOptionPane.showConfirmDialog(Sample25_2.this,
"您确定要删除该节点么?","确认",JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
//确认需要删除执行的代码
if(confirm==JOptionPane.YES_OPTION)
{
//得到选中节点的父节点
DefaultMutableTreeNode node=
      (DefaultMutableTreeNode)tempNode.getParent();
if(node==null)
{
//若没有父节点说明该节点是根节点,警告不能删除
jtf.setText("根目录不能删除!!!");
JOptionPane.showMessageDialog(Sample25_2.this,
"根目录不能删除!!!","错误",JOptionPane.WARNING_MESSAGE);
}
else
{//若具有父节点执行的代码
//设置提示信息
jtf.setText(tempNode+"被删除了!!!");
//删除以选中节点为根节点的子树
tempNode.removeFromParent();
//更新树的数据模型
((DefaultTreeModel)jt.getModel()).reload(node);
//将记录选中节点的成员变量置为null值
tempNode=null;
}
}
}
}
}


[解决办法]
完全可以,你自己重写下DefaultTreeCellRenderer很容易就能够达到这个效果。
------解决方案--------------------


public class MapEditorTreeCellRenderer
extends DefaultTreeCellRenderer {
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);

setIcon(getIcon("Icons/project.png"));

return this;
}

public Icon getIcon(String filename) {
try {
ImageIcon temp = new ImageIcon(ClassLoader.getSystemResource(filename));
return temp;
}
catch (Exception e) {
return null;
}
}
}



大概是这样

热点排行