這只是部分可能的。這是爲什麼。
要解決這個問題,我們要創造我們自己的HTMLEditorKit
截獲object
標籤,然後從object
標籤的classid
創建Component
自己。這是看起來如何*。
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的,它不可能使用<viewregistry>
標籤我們HTMLEditorKit
註冊[2]。由於OSGi環境,JavaHelp無法訪問我們的HTMLEditorKit
**。
相反,唯一可行的方法是創建與我們HTMLEditorKit
一個JEditorPane
,通過使用TOCView.parse()
創造我們自己的TOC JTree
,並告訴JEditorPane
加載幫助頁面時JTree
的選擇更改。
*這似乎長,但大部分代碼從javax.swing.text.html.ObjectView
複製[1]。我不得不從那裏複製代碼,因爲getUnloadableRepresentation
和setParameters
是私人的,不受保護。
**這可能是由於Dynamic-ImportPackage
清單條目[3]。但是這需要跳過很多圈。首先,JavaHelp清單將不得不被改變。其次,在Felix啓動後,必須告知允許使用dynamic-import
命令進行動態導入。
- http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/text/html/ObjectView.java#ObjectView
- http://docs.oracle.com/cd/E19253-01/819-0913/author/helpset.html#toolbar
- http://wiki.osgi.org/wiki/DynamicImport-Package
我懷疑這將是一個痛苦的經歷,因爲我覺得* *是JavaHelp的只是做了的Class.forName。你將不得不求助於動態導入,我不知道這是否值得。 – 2012-07-25 12:14:11
是否需要修改JavaHelp jar以在清單中包含'Dynamic-PackageImport'條目,然後在Felix中使用'dynamic-import'命令?還是有更簡單的方法來做到這一點?我發現'dynamic-import'會導致其他bundle神奇地停止。而且JavaHelp仍然無法找到我的課程。 – 2012-07-25 19:13:07
此外,事實證明,真正的罪魁禍首甚至不是在JavaHelp中,而是在'HTMLEditorKit'的'ObjectView'中:http://grepcode.com/file/repository.grepcode。COM /爪哇/根/ JDK /的openjdk/6-B14 /的javax /擺動/文本/ HTML/ObjectView.java#的ObjectView – 2012-07-25 19:36:09