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);
}
}
}