Я нашел обходной путь.Тег вставляется следующим образом:
ModifiedHTMLDocument doc = (ModifiedHTMLDocument) editor.getDocument();
int offset = editor.getSelectionStart();
//insert our special tag (if the tag is not bounded with non-whitespace character, nothing happens)
doc.insertHTML(offset, "-<specialTag />-");
//remove leading and trailing minuses
doc.remove(offset, 1); //at the current position is the minus before tag inserted
doc.remove(offset + 1, 1); //the next sign is minus after new tag (the tag is nowhere)
//Note: no, you really cannot do that: doc.remove(offset, 2), because then the tag is deleted
My ModifiedHTMLDocument
содержит метод insertHTML()
, который вызывает метод, скрытый отражением:
public void insertHTML(int offset, String htmlText) throws BadLocationException, IOException {
if (getParser() == null)
throw new IllegalStateException("No HTMLEditorKit.Parser");
Element elem = getCurrentElement(offset);
//the method insertHTML is not visible
try {
Method insertHTML = javax.swing.text.html.HTMLDocument.class.getDeclaredMethod("insertHTML",
new Class[] {Element.class, int.class, String.class, boolean.class});
insertHTML.setAccessible(true);
insertHTML.invoke(this, new Object[] {elem, offset, htmlText, false});
}
catch (Exception e) {
throw new IOException("The method insertHTML() could not be invoked", e);
}
}
Последний кусок нашего кирпича-box - это метод, ищущий текущий элемент:
public Element getCurrentElement(int offset) {
ElementIterator ei = new ElementIterator(this);
Element elem, currentElem = null;
int elemLength = Integer.MAX_VALUE;
while ((elem = ei.next()) != null) { //looking for closest element
int start = elem.getStartOffset(), end = elem.getEndOffset(), len = end - start;
if (elem.isLeaf() || elem.getName().equals("html"))
continue;
if (start <= offset && offset < end && len <= elemLength) {
currentElem = elem;
elemLength = len;
}
}
return currentElem;
}
Этот метод также является членом класса ModifiedHTMLDocument
.
Решение не является чистым, но оно временно решаетпроблема.Я надеюсь, я найду лучший комплект.Я думаю о JWebEngine .Это должно заменить текущую бедную HTMLEditorKit
, но я не знаю, позволяет ли она мне добавлять свои собственные теги.