4

我以前用过JEditorPane,但是只能显示HTML,不能显示SVG,嵌套的SVG HTML不能完整显示。

然后我用JSVGCanvas了,但是只能显示SVG,不能显示HTML。

有没有办法解决这个问题?

4

1 回答 1

5

配置JEditorPane为使用JSVGCanvasSVG 画布。要做到这一点,你需要一个专家HTMLEditorKit。这是HTLMEditorKitAppleteer

package org.pscode.ui.applet.appleteer;

import java.awt.Component;
import java.awt.Dimension;

// placeholder component
import javax.swing.JButton;

import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.View;
import javax.swing.text.ComponentView;
import javax.swing.text.PlainView;
import javax.swing.text.ViewFactory;
import javax.swing.text.Element;
import javax.swing.text.AttributeSet;
import javax.swing.text.StyleConstants;

import org.pscode.ui.applet.appleteer.AppletElement;
import org.pscode.ui.applet.appleteer.AppletLoaderContainer;

import java.util.HashMap;
import java.util.Enumeration;

import java.net.URL;

import java.util.logging.*;

/** The AppletEditorKit extends HTMLEditorKit to support the applet element. */
public class AppletEditorKit extends HTMLEditorKit {

    URL documentBase;

    PseudoBrowser browser;

    static int appletCount;
    static boolean hasNamedApplet;


    public AppletEditorKit(URL documentBase, PseudoBrowser browser) {
        this.documentBase = documentBase;
        this.browser = browser;
        appletCount = 0;
        hasNamedApplet = false;
    }

    public ViewFactory getViewFactory() {
        return new AppletHTMLFactory(documentBase, browser);
    }

    public static class AppletHTMLFactory extends HTMLFactory implements ViewFactory {

        URL documentBase;
        PseudoBrowser browser;

        AppletHTMLFactory(URL documentBase, PseudoBrowser browser) {
            this.documentBase = documentBase;
            this.browser = browser;
        }

        public View create(Element element) {
            AttributeSet set = element.getAttributes();
            Object o =
                element.getAttributes().getAttribute(StyleConstants.NameAttribute);
            if (o instanceof HTML.Tag) {

                HTML.Tag kind = (HTML.Tag) o;

                Logger.getLogger("Appleteer").log(
                    Level.FINEST, "AEK.c  HTML.Tag: " + kind);

                if (kind == HTML.Tag.APPLET ) {


                    if(!contains(element.getAttributes().getAttributeNames(),"endtag")) {
                        View view;
                        try {
                            AppletElement ae = new AppletElement(
                                element,
                                browser,
                                "applet" + appletCount++);
                            view = new AppletView(ae);
                            if ( ae.getName()!=null ) {
                                hasNamedApplet = true;
                            }
                        } catch(Exception e) {
                            return new PlainView(element);
                        }

                        return view;
                    } else {
                        return new PlainView(element);
                        //return null;
                    }
                } else if (kind == HTML.Tag.PARAM) {
                    Logger.getLogger("Appleteer").log(
                        Level.FINEST, "HTML Param: " + kind);
                }
            }
            return super.create( element );
        }
    }

    public static boolean contains(Enumeration en, String name) {
        while( en.hasMoreElements() ) {
            Object o = en.nextElement();
            if (o instanceof HTML.Attribute) {
                Logger.getLogger("Appleteer").log(
                    Level.FINEST, "HTML.Attribute: " + 0);
                if (o.toString().equals(name)) {
                    return true;
                }
            }
        }
        return false;
    }
}
于 2013-04-18T03:05:04.910 回答