如何以编程方式到达/触发JEditorPane / JTextPane内的超链接的目标

时间:2016-03-04 10:50:07

标签: java html swing jtextpane jeditorpane

我有一个封闭的源第三方应用程序,我试图在我的java程序中控制它的窗口。我设法运行第三方应用程序的main方法,并使用AWTEventListener实例拦截它生成的窗口事件。然后我遍历它生成的窗口的组件,以便找到并操纵必要的摆动控件。查找组件,单击按钮,激活切换按钮和修改文本字段工作正常,但JTextPane内部有一个我无法以编程方式触发的超链接,也没有在线找到有关如何成功完成的任何信息。建议herehere看起来很有希望,但我无法使用MouseEvent触发超链接。我还应该指出,超链接不是URL,而是内部函数。当我调用JTextPane getText()方法时,我得到:

<html>
  <head>

  </head>
  <body>
    <a href="#action">Expand Window</a>
  </body>
</html>

我的问题:是否有办法直接到达JTextPane内部超链接的目标(在这种情况下,展开窗口),而不是试图让MouseEvent模拟点击它?

1 个答案:

答案 0 :(得分:2)

我不知道,但这个例子可能会对你有帮助。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.Collection;
import java.util.LinkedHashSet;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;


public class TextPaneTest {


    public static void main(String[] args) {
        final JFrame frm = new JFrame("Editor pane test");

        final JTextPane pane = new JTextPane();
        pane.setContentType("text/html");
        pane.setText("<html>Here is the text with a <a href=\"http://google.com\">link</a></html>");
        frm.add(new JScrollPane(pane));
        final JButton btn = new JButton(new AbstractAction("Find link") {

            @Override
            public void actionPerformed(ActionEvent e) {
                final HTMLDocument doc = (HTMLDocument) pane.getDocument();
                final Collection<String> links = new LinkedHashSet<String>();
                // probably exists a better way to iterate over elements
                for (int i = 0; i < doc.getLength(); i++) {
                    final Element el = doc.getCharacterElement(i);
                    final AttributeSet a = el.getAttributes();
                    final AttributeSet anchor = (AttributeSet)a.getAttribute(HTML.Tag.A);
                    if (anchor != null) {
                        links.add((String)anchor.getAttribute(HTML.Attribute.HREF));
                    }
                }
                System.out.println("Links found: " + links);
            }
        });
        frm.add(btn, BorderLayout.EAST);
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

}