jtextpanel中获取图片

jaMsg为JTextPane对象。

JTextPane插入图片的代码:

  1. //点击了发送图片按钮  
  2.             JFileChooser jfc = new JFileChooser();  
  3.             FileNameExtensionFilter filter = new FileNameExtensionFilter("图片(jpg,gif)","gif","jpg");  
  4.             jfc.setFileFilter(filter);  
  5.               
  6.             int rtn = jfc.showOpenDialog(this);  
  7.             if(rtn == JFileChooser.APPROVE_OPTION) {  
  8.                   
  9.                 String filePath = jfc.getSelectedFile().getAbsolutePath();  
  10.                   
  11.                 //向jaMsg中插入一张图片  
  12.                 ImageIcon img = new ImageIcon(filePath);  
  13.                 this.jaMsg.insertIcon(img);  
  14.             }  
//点击了发送图片按钮
			JFileChooser jfc = new JFileChooser();
			FileNameExtensionFilter filter = new FileNameExtensionFilter("图片(jpg,gif)","gif","jpg");
			jfc.setFileFilter(filter);
			
			int rtn = jfc.showOpenDialog(this);
			if(rtn == JFileChooser.APPROVE_OPTION) {
				
				String filePath = jfc.getSelectedFile().getAbsolutePath();
				
				//向jaMsg中插入一张图片
				ImageIcon img = new ImageIcon(filePath);
				this.jaMsg.insertIcon(img);
			}


JTextPane解析出其中的图片,并放入一个list中:

  1. //获得JTextPane中的图片  
  2.             for(int i=0;i<this.jaMsg.getStyledDocument().getRootElements()[0].getElement(0).getElementCount();i++) {  
  3.                   
  4.                 ImageIcon icon = (ImageIcon) StyleConstants.getIcon(this.jaMsg.getStyledDocument().getRootElements()[0].getElement(0).getElement(i).getAttributes());  
  5.                 if(icon != null) {  
  6.                       
  7.                     list.add(icon);  
  8.                 }  
  9.             }  
//获得JTextPane中的图片
			for(int i=0;i<this.jaMsg.getStyledDocument().getRootElements()[0].getElement(0).getElementCount();i++) {
				
				ImageIcon icon = (ImageIcon) StyleConstants.getIcon(this.jaMsg.getStyledDocument().getRootElements()[0].getElement(0).getElement(i).getAttributes());
				if(icon != null) {
					
					list.add(icon);
				}
			}

JTextPane将文字及图片路径一起输出:


  1. for(int i=0;i<this.jaMsg.getText().length();i++) {  
  2.                       
  3.                     if(this.jaMsg.getStyledDocument().getCharacterElement(i).getName().equals("icon")) {  
  4.                           
  5.                         msg += "#"+list.get(k)+"#";  
  6.                         k++;  
  7.                     }else {  
  8.                           
  9.                         try {  
  10.                             msg += this.jaMsg.getStyledDocument().getText(i,1);  
  11.                         } catch (BadLocationException e) {  
  12.                             // TODO Auto-generated catch block  
  13.                             e.printStackTrace();  
  14.                         }  
  15.                     }  
  16.                 }  
  17.                 System.out.println("发送:"+msg);  
for(int i=0;i<this.jaMsg.getText().length();i++) {
					
					if(this.jaMsg.getStyledDocument().getCharacterElement(i).getName().equals("icon")) {
						
						msg += "#"+list.get(k)+"#";
						k++;
					}else {
						
						try {
							msg += this.jaMsg.getStyledDocument().getText(i,1);
						} catch (BadLocationException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
				System.out.println("发送:"+msg);

输出来的就是以下格式:

发送:打发打发#C:\Users\Administrator\Documents\360截图\360截图20120605224732628.jpg#短发的空间发的减肥的见附件

可以看到,用#号将文字和图片路径分开了,接下来就可以用获得的数据进行操作了。

 

但是,以上的代码,在用户输入一行文字之后,再按下【ENTER】键,然后在下一行插入图片。这时利用此代码就会产生IndexOutofBounds错误。

报错就报在,从list中取这一行。很明显,只有第一行的图片放入了list,后面的行都没有放。这是为什么呢?

我们查看一下JDK API文档,对于StyledDocument,它是java.swing.text下的一个类,是一个用于描述文档结构的。其中getRootElements()是从Document接口继承的方法,返回所有的根元素,Element[]。但是一个文档只有一个根,所以我们通常是getRootElements()[0]。

那么我们可以猜想得到getRootElements()[0].getElement(0)获得的是文档的第一段。而我们按了回车键后,是到了第二段,那么插入的图片,就没有放入list中。那么我们再在其后遍历想取时,自然就会报IndexOfBounds错误。

所以放入list的代码应该改为:


  1. java.util.List<ImageIcon> list = new ArrayList<ImageIcon>();  
  2.               
  3.             for(int i=0;i<doc.getRootElements()[0].getElementCount();i++){  
  4.                   
  5.                 javax.swing.text.Element root = doc.getRootElements()[0].getElement(i);  
  6.                   
  7.                 for(int j=0;j<root.getElementCount();j++){  
  8.                       
  9.                     ImageIcon icon = (ImageIcon) StyleConstants.getIcon(root.getElement(j).getAttributes());  
  10.                     if(icon!=null){  
  11.                           
  12.                         list.add(icon);  
  13.                     }  
  14.                 }  
  15.             }  
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值