Swing JDialog/JTextPane и HTML-ссылки

Я использую HTML-страницу внутри свинга JTextPane в JDialog.
В HTML у меня есть <a href="mailto:email@adress.com">John</a>
Когда я просматриваю веб-страницу через проводник, когда мышь переходит по ссылке, я вижу mailto,
Когда я нажимаю на ссылку, я получаю сообщение об ошибке "почтовый клиент по умолчанию не установлен", но я полагаю, это связано с тем, что на моем компьютере не настроен Outlook или какая-либо другая программа.
Когда я открываю JDialog из моего приложения Swing, я вижу John выделяется как ссылка, но при нажатии на ссылку ничего не происходит.
Я ожидал получить то же сообщение об ошибке, что и браузер.
Итак, мой вопрос: можно ли открыть ссылку через приложение Swing или нет?

Спасибо

2 ответа

Решение

Ни всплывающая подсказка (показывающая целевой адрес гиперссылки), ни действие при нажатии не происходит автоматически, вы должны закодировать ее: для первого зарегистрируйте панель с помощью ToolTipManager, для второго зарегистрируйте HyperlinkListener, что-то вроде:

    final JEditorPane pane = new JEditorPane("http://swingx.java.net");
    pane.setEditable(false);
    ToolTipManager.sharedInstance().registerComponent(pane);

    HyperlinkListener l = new HyperlinkListener() {
        @Override
        public void hyperlinkUpdate(HyperlinkEvent e) {
            if (HyperlinkEvent.EventType.ACTIVATED == e.getEventType()) {
                try {
                    pane.setPage(e.getURL());
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

        }

    };
    pane.addHyperlinkListener(l);

Пример об открытии страницы в той же панели. Если вы хотите активировать браузер / почтовый клиент по умолчанию, попросите Desktop (новичок в jdk1.6) сделать это за вас.

final JEditorPane jep = new JEditorPane("text/html",
    "The rain in <a href='http://foo.com/'>Spain</a> falls mainly on the <a href='http://bar.com/'>plain</a>.");

jep.setEditable(false);
jep.setOpaque(false);
final Desktop desktop = Desktop.getDesktop(); 

jep.addHyperlinkListener(new HyperlinkListener() {

    public void hyperlinkUpdate(HyperlinkEvent hle) {
        if (HyperlinkEvent.EventType.ACTIVATED.equals(hle.getEventType())) {
            try {
                System.out.println(hle.getURL());
                jep.setPage(hle.getURL());
                try {
                    desktop.browse(new URI(hle.getURL().toString()));
                } catch (URISyntaxException ex) {
                    Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (IOException ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
});

JPanel p = new JPanel();
p.add(new JLabel("Foo."));
p.add(jep);
p.add(new JLabel("Bar."));

JFrame f = new JFrame("HyperlinkListener");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(p, BorderLayout.CENTER);
f.setSize(400, 150);
f.setVisible(true);
Другие вопросы по тегам