Java JEditorPane - 尝试编辑html标记值并获取Exception

时间:2013-07-14 10:05:05

标签: java html swing jeditorpane

我有一个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的地方,但这是一个受保护的方法,这意味着我无法从这段代码中调用它...

所以基本上我的问题是,如果你找到了你想要的元素,你如何编辑它的属性?

1 个答案:

答案 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?为什么他们被设置为受保护?程序员试图阻止你做什么以及为什么?