Swing HTMLDocument不包含所有HTML元素?

时间:2016-06-03 12:53:44

标签: java swing jeditorpane

我有一个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代码中点击它。

2 个答案:

答案 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,例如下面隐含段落中的内容。

image

控制台:

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): ''