1

私は JEditorPane を持っていて、html 要素の属性の 1 つを編集しようとしています。基本的に、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 に答える