caret position into the html of JEditorPane

不问归期 提交于 2019-12-10 18:53:45

问题


The getCaretPosition method of JEditorPane gives an index into the text only part of the html control. Is there a possibility to get the index into the html text?

To be more specific suppose I have a html text (where | denotes the caret position)

abcd<img src="1.jpg"/>123|<img src="2.jpg"/>

Now getCaretPosition gives 8 while I would need 25 as a result to read out the filename of the image.


回答1:


The underlying model of the JEditorPane (some subclass of StyledDocument, in your case HTMLDocument) doesn't actually hold the HTML text as its internal representation. Instead, it has a tree of Elements containing style attributes. It only becomes HTML once that tree is run through the HTMLWriter. That makes what you're trying to do kinda tricky! I could imagine putting some flag attribute on the character element that you're currently on, and then using a specially crafted subclass of HTMLWriter to write out until that marker and count the characters, but that sounds like something of an epic hack. There is probably an easier way to get what you want there, though it's a bit unclear to me what that actually is.




回答2:


I had the same problem, and solved it with the following code:

editor.getDocument().insertString(editor.getCaretPosition(),"String to insert", null);



回答3:


I don't think you can transform your caret to be able to count tags as characters. If your final aim is to read image filename, you should use :

HTMLEditorKit (JEditorPane.getEditorKitForContentType("text/html") );

For more information about utilisation see Oracle HTMLEditorKit documentation and this O'Reilly PDF that contains interesting examples.




回答4:


I had mostly the same problem and solved it with the following method (I used JTextPane, but it should be the same for JEditorPane):

public int getCaretPositionHTML(JTextPane pane) {
    HTMLDocument document = (HTMLDocument) pane.getDocument();
    String text = pane.getText();
    String x;
    Random RNG = new Random();
    while (true) {
        x = RNG.nextLong() + "";
        if (text.indexOf(x) < 0) break;
    }
    try {
        document.insertString(pane.getCaretPosition(), x, null);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
        return -1;
    }
    text = pane.getText();
    int i = text.indexOf(x);
    pane.setText(text.replace(x, ""));
    return i;
}

It just assumes your JTextPane won't contain all possible Long values ;)



来源:https://stackoverflow.com/questions/8866369/caret-position-into-the-html-of-jeditorpane

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!