我有一个swing应用程序,其中包含一个显示HTML文件的对话框。我是这样做的:
std::tolower
这符合我的预期。它正确显示HTML文件。
我现在尝试在文档中找到一个元素,所以我这样做:
URL url = getClass().getResource("/resources/EULA.html");
JDialog eulaDialog = new JDialog();
JEditorPane eulaEP = new JEditorPane();
try {
eulaEP.setPage(url);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JScrollPane scrollPane = new JScrollPane(eulaEP);
eulaDialog.getContentPane().add(scrollPane);
eulaDialog.setBounds(400, 200, 700, 600);
eulaDialog.setVisible(true);
但是这会返回null(即使元素显示在对话框中)。
我决定通过这样做来检查文档中保存了哪些元素:
HTMLDocument htm = (HTMLDocument) eulaEP.getDocument();
Element el = htm.getElement("unique_id");
然而这只返回了4个元素; HTML,正文,p和内容。我的HTML文件有很多(而且内容是什么?)我做错了什么?
为了澄清,HTML包含一个按钮,我想在这个按钮中添加一个ActionListener,这样我就可以在我的java代码中点击它。
答案 0 :(得分:1)
我的猜测是你在文件满载之前阅读它。 doocumentation for JEditorPane.setPage对此非常有用:
这可以同步或异步加载,具体取决于EditorKit返回的文档。 ...如果文档是异步加载的,文档将立即通过调用setDocument安装到编辑器中,这将触发文档属性更改事件,然后将创建一个将开始执行实际加载的线程。在这种情况下,直接调用此方法不会触发页面属性更改事件,而是在执行加载的线程完成时触发。它也将在事件派发线程上触发。
因此,在加载之前,您不应该查看文档。例如:
JEditorPane eulaEP = new JEditorPane();
eulaEP.addPropertyChangeListener("page", e -> {
HTMLDocument htm = (HTMLDocument) eulaEP.getDocument();
Element el = htm.getElement("unique_id");
// ...
});
try {
eulaEP.setPage(url);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
答案 1 :(得分:1)
在下面的示例中,HTMLDocument::getElement(String id)
找到其HTML.Attribute.id
属性的值为Element
的{{1}}。 "unique_id"
为Element
我不确定BranchElement(div) 1,6
迭代在哪里出错,但您可以在下面的控制台输出中看到Element
中的unique_id
值。由于HTMLDocument
会对HTML进行建模,因此随附的BranchElement(div)
可能会合成HTML.Tag CONTENT
,例如下面隐含段落中的内容。
控制台:
HTMLReader
代码:
BranchElement(div) 1,6
Element: 'BranchElement(html) 0,6', name: 'html', children: 2, attributes: 1, leaf: false
Attribute: 'name', Value: 'html'
Element: 'BranchElement(head) 0,1', name: 'head', children: 1, attributes: 1, leaf: false
Attribute: 'name', Value: 'head'
Element: 'BranchElement(p-implied) 0,1', name: 'p-implied', children: 1, attributes: 1, leaf: false
Attribute: 'name', Value: 'p-implied'
Element: 'LeafElement(content) 0,1', name: 'content', children: 0, attributes: 2, leaf: true
Attribute: 'CR', Value: 'true'
Attribute: 'name', Value: 'content'
Content (0-1): ''
Element: 'BranchElement(body) 1,6', name: 'body', children: 1, attributes: 1, leaf: false
Attribute: 'name', Value: 'body'
Element: 'BranchElement(div) 1,6', name: 'div', children: 1, attributes: 3, leaf: false
Attribute: 'align', Value: 'center'
Attribute: 'id', Value: 'unique_id'
Attribute: 'name', Value: 'div'
Element: 'BranchElement(p-implied) 1,6', name: 'p-implied', children: 2, attributes: 1, leaf: false
Attribute: 'name', Value: 'p-implied'
Element: 'LeafElement(content) 1,5', name: 'content', children: 0, attributes: 1, leaf: true
Attribute: 'name', Value: 'content'
Content (1-5): 'Test'
Element: 'LeafElement(content) 5,6', name: 'content', children: 0, attributes: 2, leaf: true
Attribute: 'CR', Value: 'true'
Attribute: 'name', Value: 'content'
Content (5-6): ''