在JTextPane中如果输入了文本且插入了图形,那么在程序要重新获得JTextPane中选中的内容时:
1.如何知道选中的是文本还是图形?
2.文本可以用getSelectedText()获得,那图形怎么样获得呢?
高分请教…………

解决方案 »

  1.   

    Up~~~~!!!JTextPane难道对图形的操作只有插入吗?插入之后就不能有其它的操作了吗?急 ~~~~~~~ 啊~~~~
      

  2.   

    去研究一下JDK自带的演示程序 Stylepad吧,其中的ElementTreePanel.java中的caretUpdate()方法处理选择变化的事件,ElementTreeModel类中有解析文档结构的处理代码
      

  3.   

    可不可以说下思路,代码太长又没注视,实在不太好看啊~~是不是给JTextPane加入DocumentListener监听呢?那么怎么从DocmentEvent事件中知道改变的是文本还是图片呢?
      

  4.   

    怎么没人呢??Document中所谓的Element是按什么标准分的啊?有没有属性可以区分图像与文本呢?
      

  5.   

    比如我粘贴系统剪贴板上的内容到JTextPane中,这个动作可以由DocumentListener捕获,但是怎么进一步知道粘贴的是文本还是图片呢?帮帮忙吧,等了N天了……
      

  6.   

    import java.awt.BorderLayout;import javax.swing.*;
    import javax.swing.event.CaretEvent;
    import javax.swing.event.CaretListener;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.Element;
    import javax.swing.text.StyleConstants;public class TextPaneTest
    {
    public static void main(String[] args)
    {
    final Icon icon = new ImageIcon(TextPaneTest.class.getResource("alice.gif"));
    final JTextPane tp = new JTextPane();
    JScrollPane sp = new JScrollPane(tp);
    tp.insertIcon(icon); JFrame f = new JFrame();
    f.getContentPane().add(sp, BorderLayout.CENTER);
    f.setSize(800, 600);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true); tp.addCaretListener(new CaretListener() {
    public void caretUpdate(CaretEvent e)
    {
    AbstractDocument doc = (AbstractDocument) tp.getDocument();
    Element[] rootEles = doc.getRootElements();     int selBegin = Math.min(e.getDot(), e.getMark());
        int end = Math.max(e.getDot(), e.getMark());
        for (int counter = 0; counter < rootEles.length; counter++) {
         int start = selBegin;
    while (start <= end) {
         Element ele = getLeafElement(rootEles[counter], start);      AttributeSet attr = ele.getAttributes();
         Object icon = attr.getAttribute(StyleConstants.IconAttribute);
         if (icon != null) {
         System.out.println(icon);
         } if (start >= ele.getEndOffset())
    start++;
    else
    start = ele.getEndOffset();
    }
        }
    }

    private Element getLeafElement(Element rootElement, int position)
    {
    Element child = rootElement.getElement(rootElement.getElementIndex(position)); while (!child.isLeaf()) {
    child = child.getElement(child.getElementIndex(position));
    }
    return child;
    }
    });
    }
    }