1

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

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

4

2 回答 2

2

问题是 HtmlDocument 要求您在尝试更改任何属性之前执行 writeLock 并在之后执行 writeUnlock。所以为了解决这个问题,我必须:

首先为我的 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 ?为什么将它们设置为受保护?程序员试图阻止你做什么,为什么?

于 2013-07-14T10:48:09.813 回答
0
## Use the  htmlDoc.setCharacterAttributes (...);##
ElementIterator it = new ElementIterator(htmlDoc);
Element elem;
 while ((elem = it.next()) != null) {
   if (elem.getName().equals("img")) {
      AttributeSet atts = elem.getAttributes();
       // Modifiable 
      SimpleAttributeSet simple = new SimpleAttributeSet(atts);
      String s = (String) simple.getAttribute(HTML.Attribute.SRC);
      if (s != null) {
           System.out.println(s); // testing
           int len = elem.getEndOffset() - elem.getStartOffset();
           //simple.removeAttribute(HTML.Attribute.SRC);
           simple.addAttribute( HTML.Attribute.SRC, **newSRC_URL_String** );
           //
           //  The doc takes care of the locks 
           //
           htmlDoc.setCharacterAttributes(
             elem.getStartOffset(),len,simple,true);
 }
 }
 }
于 2022-02-11T09:17:05.180 回答