позиция каретки в html JEditorPane - PullRequest
3 голосов
/ 15 января 2012

Метод getCaretPosition в JEditorPane предоставляет индекс в текстовую часть только элемента управления html. Есть ли возможность получить индекс в HTML-текст?

Если быть более точным, предположим, у меня есть HTML-текст (где | обозначает позицию каретки)

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

Теперь getCaretPosition дает 8, в то время как в результате мне понадобится 25, чтобы прочитать имя файла изображения.

Ответы [ 4 ]

1 голос
/ 08 февраля 2012

Базовая модель JEditorPane (некоторый подкласс StyledDocument, в вашем случае HTMLDocument) на самом деле не содержит текст HTML в качестве своего внутреннего представления. Вместо этого у него есть дерево элементов, содержащих атрибуты стиля. Он становится HTML только тогда, когда это дерево проходит через HTMLWriter. Это делает то, что вы пытаетесь сделать, довольно сложно! Я мог бы представить атрибут атрибута flag в элементе персонажа, на котором вы сейчас находитесь, а затем использовать специально созданный подкласс HTMLWriter для записи до этого маркера и подсчета символов, но это звучит как что-то вроде эпического хака. Вероятно, есть более простой способ получить то, что вы хотите, хотя мне немного непонятно, что это на самом деле.

1 голос
/ 28 июня 2013

У меня была такая же проблема, и я решил ее с помощью следующего кода:

editor.getDocument().insertString(editor.getCaretPosition(),"String to insert", null);
1 голос
/ 15 января 2012

Я не думаю, что вы можете преобразовать свою карету, чтобы иметь возможность считать теги как символы.Если вашей конечной целью является чтение имени файла изображения, вы должны использовать:

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

Для получения дополнительной информации об использовании см. Документация Oracle HTMLEditorKit и O'Reilly PDF это содержит интересные примеры.

0 голосов
/ 19 августа 2016

У меня была в основном та же проблема, и я решил ее следующим способом (я использовал JTextPane, но он должен быть таким же для 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;
}

Это просто предполагает, что ваш JTextPane выигралне содержит все возможные значения Long;)

...