我有一个JEditorPane,我正在尝试编辑html元素属性,基本上将src x值更改为自定义值
我的代码是:
// 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
我读了一些你可以使用writeLock的地方,但这是一个受保护的方法,这意味着我无法从这段代码中调用它...
所以基本上我的问题是,如果你找到了你想要的元素,你如何编辑它的属性?
答案 0 :(得分:1)
问题是HtmlDocument要求你在尝试更改任何属性和之后的writeUnlock之前执行writeLock。所以为了解决这个问题,我不得不:
首先扩展我的JEditorPane的EditorKit以使用自定义的HtmlDocument。然后我扩展了HTMLDocument以使writeLock和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?为什么他们被设置为受保护?程序员试图阻止你做什么以及为什么?