0

JavaHelp は Sun によって作成されたライブラリであり、Swing アプリケーションで HTML ヘルプ ページを表示します。JavaHelp を使用すると、Swing コンポーネントをその HTML ページに埋め込むことができます。

<html>
<object classid="java:javax.swing.JButton">
   <param name="text" value="Wow, a Swing component in HTML HTML!">
</object>
</html>

これについては、http: //docs.oracle.com/cd/E19253-01/819-0913/dev/lwcomp.htmlでさらに説明します。

Apache Felix で大規模な OSGi アプリケーションを実行しています。上記のように、classid属性は埋め込みたい Swing コンポーネント クラスの FQN を参照します。これで、自分のバンドルで定義した Swing コンポーネント クラスを参照したいと思います。JavaHelp は独自のバンドルで実行されているため、バンドル内のクラスを参照できません。??クラスが見つからないことを示すHTMLページが表示されます。バンドル内のクラスを参照する JavaHelp バンドルを取得するにはどうすればよいですか?

4

1 に答える 1

2

これは部分的にのみ可能です。理由は次のとおりです。

この問題を解決するには、タグHTMLEditorKitをインターセプトする独自のobjectタグを作成し、タグのComponentから自分自身を作成する必要があります。これがその様子です*。objectclassid

public class OurHTMLEditorKit extends HTMLEditorKit {
    public ViewFactory getViewFactory() {
        return new HTMLEditorKit.HTMLFactory() {
            public View create(Element elem) {
                if (elem.getName().equalsIgnoreCase("object"))
                    return new InternalObjectView(elem);
                else
                    return super.create(elem);
            }
        };
    }
}

private static Object attemptToGetClass(final String className) {
    try {
        Class c = Class.forName(className);
        Object o = c.newInstance();
        return o;
    } catch (Exception e) {
        logger.error(e.getMessage());
    }
    return null;
}


private static class InternalObjectView extends ObjectView {
    public InternalObjectView(Element elem) {
        super(elem);
        logger.info(elem.toString());
    }

    protected Component createComponent() {
        AttributeSet attrs = getElement().getAttributes();
        String classname = ((String) attrs.getAttribute(HTML.Attribute.CLASSID)).trim();
        try {
            Component comp = (Component) attemptToGetClass(classname);
            setParameters(comp, attrs);
            return comp;
        } catch (Exception e) {
            logger.warn(e.getMessage());
        }
        return getUnloadableRepresentation();
    }

    // Copied from javax.swing.text.html.ObjectView with modifications to how exceptions are reported

    Component getUnloadableRepresentation() {
        Component comp = new JLabel("??");
        comp.setForeground(Color.red);
        return comp;
    }

    private void setParameters(Component comp, AttributeSet attr) {
        Class k = comp.getClass();
        BeanInfo bi;
        try {
            bi = Introspector.getBeanInfo(k);
        } catch (IntrospectionException ex) {
            logger.warn("introspector failed, ex: "+ex);
            return;             // quit for now
        }
        PropertyDescriptor props[] = bi.getPropertyDescriptors();
        for (int i=0; i < props.length; i++) {
            //      System.err.println("checking on props[i]: "+props[i].getName());
            Object v = attr.getAttribute(props[i].getName());
            if (v instanceof String) {
                // found a property parameter
                String value = (String) v;
                Method writer = props[i].getWriteMethod();
                if (writer == null) {
                    // read-only property. ignore
                    return;     // for now
                }
                Class[] params = writer.getParameterTypes();
                if (params.length != 1) {
                    // zero or more than one argument, ignore
                    return;     // for now
                }
                Object [] args = { value };
                try {
                    writer.invoke(comp, args);
                } catch (Exception ex) {
                    logger.warn("Invocation failed: " + ex.getMessage());
                    // invocation code
                }
            }
        }
    }
}

しかし、JavaHelp では、タグHTMLEditorKitを使用して登録することはできません [2]。<viewregistry>OSGi 環境のため、JavaHelp は弊社のHTMLEditorKit** にアクセスできません。

代わりに、 を使用して を作成し、を使用して独自の目次を作成JEditorPaneし、の選択が変更されたときにヘルプ ページをロードするように に指示することが唯一の方法です。HTMLEditorKitJTreeTOCView.parse()JEditorPaneJTree


※長く見えますが、ほとんどのコードはjavax.swing.text.html.ObjectView[1]からのコピペです。getUnloadableRepresentationsetParametersは非公開であり、保護されていないため、そこからコードをコピーする必要がありました。

Dynamic-ImportPackage**これは、マニフェスト エントリ [3]によって可能になる可能性があります。しかし、これには多くの困難を乗り越える必要があります。まず、JavaHelp マニフェストを変更する必要があります。次に、Felix の起動後に、dynamic-importコマンドを使用して動的インポートを許可するように指示する必要があります。

  1. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/text/html/ObjectView.java#ObjectView
  2. http://docs.oracle.com/cd/E19253-01/819-0913/author/helpset.html#toolbar
  3. http://wiki.osgi.org/wiki/DynamicImport-Package
于 2012-07-25T23:15:16.140 に答える