2013-07-14 1 views
0

У меня есть JEditorPane, и я пытаюсь изменить один Ф.О. HTML-атрибутов элемента, в основном меняя значение х исходников к таможенной стоимостиJava JEditorPane - Попытка изменить значение тега HTML и получить исключение

код у меня есть:

// Get <img src="..."> tag 
RunElement imageTagElement = getImageTagElement(htmlDocument); 

// Print src attribute value 
System.out.println("src : " + runElement.getAttribute(HTML.Attribute.SRC)); 

// Replace existing src value 
runElement.removeAttribute(HTML.Attribute.SRC); 
runElement.addAttribute(HTML.Attribute.SRC, "customValue"); 

Я получаю следующее исключение в позапрошлую строке при попытке удалить существующий атрибут (потому что вы не можете заменить):

javax.swing.text.StateInvariantError: Illegal cast to MutableAttributeSet 

Я прочитал несколько мест, которые вы можете использовать блокировку записи, но это метод защищен, , который означает, что я не могу назвать его из этого кода ...

Так в основном мой вопрос заключается в том, что если вы нашли элемент, хотите, как вы отредактируете его атрибуты?

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

0

Проблема заключается в том, что HtmlDocument требует, чтобы вы выполнили writeLock, прежде чем пытаться изменить любые атрибуты и writeUnlock после. Чтобы решить эту проблему, мне пришлось:

Сначала расширьте EditorKit для моей JEditorPane, чтобы использовать пользовательский HtmlDocument. Тогда я продлил HTMLDocument сделать блокировку записи и writeUnlock публично доступного для:

public class ExtendedHTMLDocument extends HTMLDocument 
{ 
    public void hackWriteLock() 
    { 
     writeLock(); 
    } 

    public void hackWriteUnlock() 
    { 
     writeUnlock(); 
    } 
} 

Тогда я сделал:

public class ExtendedEditorKit extends HTMLEditorKit 
{ 
    @Override 
    public Document createDefaultDocument() 
    { 
     // For the left out code copy what's in the super method 
     .. 
     HTMLDocument doc = new ExtendedHTMLDocument(ss); 
     .. 
    } 
} 

Теперь я мог в коде выше, все, что нужно сделать, это вызвать блокировку, прежде чем пытаться отредактировать атрибуты и разблокировать, когда я это сделаю:

// lock 
htmlDocument.hackWriteLock() 

// Get <img src="..."> tag 
RunElement imageTagElement = getImageTagElement(htmlDocument); 

// Print src attribute value 
System.out.println("src : " + runElement.getAttribute(HTML.Attribute.SRC)); 

// Replace existing src value 
runElement.removeAttribute(HTML.Attribute.SRC); 
runElement.addAttribute(HTML.Attribute.SRC, "customValue"); 

// unlock 
htmlDocument.hackWriteUnlock() 

И все работает так, как ожидалось. Я могу изменять и редактировать атрибуты в документе.

Я думаю, что я сейчас не совсем понимаю или ценю, почему вы не можете публично открывать writeLock и writeUnlock? Почему они были настроены как защищенные? Что, где программисты пытаются помешать вам делать и почему?

Смежные вопросы