JEdi​​torPane中的超链接未在MAC上打开

时间:2016-08-04 01:47:45

标签: java macos swing joptionpane jeditorpane

我有一个JEditorPane,在JOptionPane中显示,我想在关闭我的应用程序之前打开一个URL。它在Windows和Linux上运行良好,但它在Mac上无法运行。

以下是代码:

//LINK
String link = "http://www.google.com/";
String link_name = "Google";

//Editor_Pane
JEditorPane editor_pane = new JEditorPane();
editor_pane.setEditorKit(JEditorPane.createEditorKitForContentType("text/html"));
editor_pane.setText( /*some text*/  + "<a href=\"" + link + "\">" + link_name + "</a>");
editor_pane.setEditable(false);

//ADD A LISTENER
editor_pane.addHyperlinkListener(new HyperlinkListener(){
    public void hyperlinkUpdate(HyperlinkEvent e){
        if(e.getEventType() == (HyperlinkEvent.EventType.ACTIVATED)){

            //OPEN THE LINK
            try{ Desktop.getDesktop().browse(e.getURL().toURI());
            }catch (IOException | URISyntaxException e1) {e1.printStackTrace();}

            //EXIT
            System.exit(0);
        }
    }
});

//SHOW THE PANE
JOptionPane.showOptionDialog(null, editor_pane, "text", JOptionPane.DEFAULT_OPTION, 
                             JOptionPane.PLAIN_MESSAGE, null, new Object[] {}, null);

该链接似乎是可点击的,但点击后没有任何反应,即使我尝试删除Desktop.browse方法并仅使用exit方法。

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:4)

尝试添加:

editor_pane.setEditable(false);

对于要点击的链接,窗格需要只读。有关详细信息,请参阅JEditorPane

  

如果JEditorPane,HTML EditorKit将生成超链接事件   不可编辑(JEditorPane.setEditable(false);已被调用)。

编辑:

import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;

import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class TestLink {

    public static void main(String[] args) {
        JLabel label = new JLabel("stackoverflow");
        label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

        label.addMouseListener(new MouseAdapter() {  
            public void mouseClicked(MouseEvent e) {  
                if (Desktop.isDesktopSupported()) {
                    try {
                      Desktop.getDesktop().browse(new URI("http://stackoverflow.com"));
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                  } else { 
                      //TODO 
                  }
            }  
        }); 
        JOptionPane.showMessageDialog(null, label);
    }
}