JTextPane插入图片和获得插入图片的位置及路径

jaMsg为JTextPane对象。

JTextPane插入图片的代码:

//点击了发送图片按钮
			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中:

//获得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将文字及图片路径一起输出:

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的代码应该改为:

java.util.List<ImageIcon> list = new ArrayList<ImageIcon>();
			
			for(int i=0;i<doc.getRootElements()[0].getElementCount();i++){
				
				javax.swing.text.Element root = doc.getRootElements()[0].getElement(i);
				
				for(int j=0;j<root.getElementCount();j++){
					
					ImageIcon icon = (ImageIcon) StyleConstants.getIcon(root.getElement(j).getAttributes());
					if(icon!=null){
						
						list.add(icon);
					}
				}
			}


 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值