代码之家  ›  专栏  ›  技术社区  ›  amit

如何在JLabel中添加超链接?

  •  87
  • amit  · 技术社区  · 17 年前

    在JLabel中添加超链接的最佳方式是什么?我可以使用html标记获取视图,但是当用户单击浏览器时,如何打开浏览器呢?

    12 回复  |  直到 6 年前
        1
  •  98
  •   McDowell rahul gupta    14 年前

    您可以使用 JLabel ,但另一种选择是样式a JButton accessibility 并且可以使用 ActionListener

      public static void main(String[] args) throws URISyntaxException {
        final URI uri = new URI("http://java.sun.com");
        class OpenUrlAction implements ActionListener {
          @Override public void actionPerformed(ActionEvent e) {
            open(uri);
          }
        }
        JFrame frame = new JFrame("Links");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(100, 400);
        Container container = frame.getContentPane();
        container.setLayout(new GridBagLayout());
        JButton button = new JButton();
        button.setText("<HTML>Click the <FONT color=\"#000099\"><U>link</U></FONT>"
            + " to go to the Java website.</HTML>");
        button.setHorizontalAlignment(SwingConstants.LEFT);
        button.setBorderPainted(false);
        button.setOpaque(false);
        button.setBackground(Color.WHITE);
        button.setToolTipText(uri.toString());
        button.addActionListener(new OpenUrlAction());
        container.add(button);
        frame.setVisible(true);
      }
    
      private static void open(URI uri) {
        if (Desktop.isDesktopSupported()) {
          try {
            Desktop.getDesktop().browse(uri);
          } catch (IOException e) { /* TODO: error handling */ }
        } else { /* TODO: error handling */ }
      }
    
        2
  •  28
  •   Stefan Alex Stybaev    13 年前

    我想提供另一个解决方案。它与已经提出的类似,因为它在JLabel中使用HTML代码,并在其上注册鼠标侦听器,但当您将鼠标移动到链接上时,它也会显示一个指针光标,因此;感觉就像大多数用户所期望的那样。如果平台不支持浏览,则不会创建可能误导用户的蓝色带下划线的HTML链接。相反,链接只是以纯文本的形式呈现。

    public class JLabelLink extends JFrame {
    
    private static final String LABEL_TEXT = "For further information visit:";
    private static final String A_VALID_LINK = "http://stackoverflow.com";
    private static final String A_HREF = "<a href=\"";
    private static final String HREF_CLOSED = "\">";
    private static final String HREF_END = "</a>";
    private static final String HTML = "<html>";
    private static final String HTML_END = "</html>";
    
    public JLabelLink() {
        setTitle("HTML link via a JLabel");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
    
        JLabel label = new JLabel(LABEL_TEXT);
        contentPane.add(label);
    
        label = new JLabel(A_VALID_LINK);
        contentPane.add(label);
        if (isBrowsingSupported()) {
            makeLinkable(label, new LinkMouseListener());
        }
    
        pack();
    }
    
    private static void makeLinkable(JLabel c, MouseListener ml) {
        assert ml != null;
        c.setText(htmlIfy(linkIfy(c.getText())));
        c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        c.addMouseListener(ml);
    }
    
    private static boolean isBrowsingSupported() {
        if (!Desktop.isDesktopSupported()) {
            return false;
        }
        boolean result = false;
        Desktop desktop = java.awt.Desktop.getDesktop();
        if (desktop.isSupported(Desktop.Action.BROWSE)) {
            result = true;
        }
        return result;
    
    }
    
    private static class LinkMouseListener extends MouseAdapter {
    
        @Override
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            JLabel l = (JLabel) evt.getSource();
            try {
                URI uri = new java.net.URI(JLabelLink.getPlainLink(l.getText()));
                (new LinkRunner(uri)).execute();
            } catch (URISyntaxException use) {
                throw new AssertionError(use + ": " + l.getText()); //NOI18N
            }
        }
    }
    
    private static class LinkRunner extends SwingWorker<Void, Void> {
    
        private final URI uri;
    
        private LinkRunner(URI u) {
            if (u == null) {
                throw new NullPointerException();
            }
            uri = u;
        }
    
        @Override
        protected Void doInBackground() throws Exception {
            Desktop desktop = java.awt.Desktop.getDesktop();
            desktop.browse(uri);
            return null;
        }
    
        @Override
        protected void done() {
            try {
                get();
            } catch (ExecutionException ee) {
                handleException(uri, ee);
            } catch (InterruptedException ie) {
                handleException(uri, ie);
            }
        }
    
        private static void handleException(URI u, Exception e) {
            JOptionPane.showMessageDialog(null, "Sorry, a problem occurred while trying to open this link in your system's standard browser.", "A problem occured", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    private static String getPlainLink(String s) {
        return s.substring(s.indexOf(A_HREF) + A_HREF.length(), s.indexOf(HREF_CLOSED));
    }
    
    //WARNING
    //This method requires that s is a plain string that requires
    //no further escaping
    private static String linkIfy(String s) {
        return A_HREF.concat(s).concat(HREF_CLOSED).concat(s).concat(HREF_END);
    }
    
    //WARNING
    //This method requires that s is a plain string that requires
    //no further escaping
    private static String htmlIfy(String s) {
        return HTML.concat(s).concat(HTML_END);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                new JLabelLink().setVisible(true);
            }
        });
    }
    }
    
        3
  •  18
  •   ibrabelware    12 年前

    我写了一篇关于如何在jLabel上设置超链接或mailto的文章。

    那就试试吧 it

    /**
     * Example of a jLabel Hyperlink and a jLabel Mailto
     */
    
    import java.awt.Cursor;
    import java.awt.Desktop;
    import java.awt.EventQueue;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    /**
     *
     * @author ibrabelware
     */
    public class JLabelLink extends JFrame {
        private JPanel pan;
        private JLabel contact;
            private JLabel website;
        /**
         * Creates new form JLabelLink
         */
        public JLabelLink() {
            this.setTitle("jLabelLinkExample");
            this.setSize(300, 100);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
    
            pan = new JPanel();
            contact = new JLabel();
            website = new JLabel();
    
            contact.setText("<html> contact : <a href=\"\">YourEmailAddress@gmail.com</a></html>");
            contact.setCursor(new Cursor(Cursor.HAND_CURSOR));
    
            website.setText("<html> Website : <a href=\"\">http://www.google.com/</a></html>");
            website.setCursor(new Cursor(Cursor.HAND_CURSOR));
    
        pan.add(contact);
        pan.add(website);
            this.setContentPane(pan);
            this.setVisible(true);
            sendMail(contact);
            goWebsite(website);
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            /*
             * Create and display the form
             */
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new JLabelLink().setVisible(true);
                }
            });
        }
    
        private void goWebsite(JLabel website) {
            website.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    try {
                        Desktop.getDesktop().browse(new URI("http://www.google.com/webhp?nomo=1&hl=fr"));
                    } catch (URISyntaxException | IOException ex) {
                        //It looks like there's a problem
                    }
                }
            });
        }
    
        private void sendMail(JLabel contact) {
            contact.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    try {
                        Desktop.getDesktop().mail(new URI("mailto:YourEmailAddress@gmail.com?subject=TEST"));
                    } catch (URISyntaxException | IOException ex) {
                        //It looks like there's a problem
                    }
                }
            });
        }
    }
    
        4
  •  15
  •   dimo414    9 年前

    使现代化 我已经把房间收拾好了 SwingLink https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java


    @麦克道尔的答案很好,但有几点可以改进。值得注意的是,超链接以外的文本是可单击的,即使某些样式已更改/隐藏,它仍然看起来像一个按钮。虽然可访问性很重要,但一致的UI也很重要。

    public class SwingLink extends JLabel {
      private static final long serialVersionUID = 8273875024682878518L;
      private String text;
      private URI uri;
    
      public SwingLink(String text, URI uri){
        super();
        setup(text,uri);
      }
    
      public SwingLink(String text, String uri){
        super();
        setup(text,URI.create(uri));
      }
    
      public void setup(String t, URI u){
        text = t;
        uri = u;
        setText(text);
        setToolTipText(uri.toString());
        addMouseListener(new MouseAdapter() {
          public void mouseClicked(MouseEvent e) {
            open(uri);
          }
          public void mouseEntered(MouseEvent e) {
            setText(text,false);
          }
          public void mouseExited(MouseEvent e) {
            setText(text,true);
          }
        });
      }
    
      @Override
      public void setText(String text){
        setText(text,true);
      }
    
      public void setText(String text, boolean ul){
        String link = ul ? "<u>"+text+"</u>" : text;
        super.setText("<html><span style=\"color: #000099;\">"+
        link+"</span></html>");
        this.text = text;
      }
    
      public String getRawText(){
        return text;
      }
    
      private static void open(URI uri) {
        if (Desktop.isDesktopSupported()) {
          Desktop desktop = Desktop.getDesktop();
          try {
            desktop.browse(uri);
          } catch (IOException e) {
            JOptionPane.showMessageDialog(null,
                "Failed to launch the link, your computer is likely misconfigured.",
                "Cannot Launch Link",JOptionPane.WARNING_MESSAGE);
          }
        } else {
          JOptionPane.showMessageDialog(null,
              "Java is not able to launch links on your computer.",
              "Cannot Launch Link", JOptionPane.WARNING_MESSAGE);
        }
      }
    }
    

    SwingLink link = new SwingLink("Java", "http://java.sun.com");
    mainPanel.add(link);
    
        5
  •  14
  •   Edward Falk    14 年前

        6
  •  14
  •   PAI Kaarel    5 年前

    也许用 JXHyperlink 从…起 SwingX JButton . 一些有用的链接:

        7
  •  5
  •   Srikanth    17 年前

    如果<a href=“link”>不起作用,那么:

    1. 创建一个JLabel并添加一个MouseListener(将标签装饰成一个超链接)
    2. 使生效 mouseClicked() 事件
    3. 在mouseClicked()事件的实现中,执行您的操作

    看看 java.awt.Desktop 用于使用默认浏览器打开链接的API(此API仅可从Java6获得)。

        8
  •  4
  •   moomoohk    13 年前

    public static JLabel linkify(final String text, String URL, String toolTip)
    {
        URI temp = null;
        try
        {
            temp = new URI(URL);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        final URI uri = temp;
        final JLabel link = new JLabel();
        link.setText("<HTML><FONT color=\"#000099\">"+text+"</FONT></HTML>");
        if(!toolTip.equals(""))
            link.setToolTipText(toolTip);
        link.setCursor(new Cursor(Cursor.HAND_CURSOR));
        link.addMouseListener(new MouseListener()
        {
            public void mouseExited(MouseEvent arg0)
            {
                link.setText("<HTML><FONT color=\"#000099\">"+text+"</FONT></HTML>");
            }
    
            public void mouseEntered(MouseEvent arg0)
            {
                link.setText("<HTML><FONT color=\"#000099\"><U>"+text+"</U></FONT></HTML>");
            }
    
            public void mouseClicked(MouseEvent arg0)
            {
                if (Desktop.isDesktopSupported())
                {
                    try
                    {
                        Desktop.getDesktop().browse(uri);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
                else
                {
                    JOptionPane pane = new JOptionPane("Could not open link.");
                    JDialog dialog = pane.createDialog(new JFrame(), "");
                    dialog.setVisible(true);
                }
            }
    
            public void mousePressed(MouseEvent e)
            {
            }
    
            public void mouseReleased(MouseEvent e)
            {
            }
        });
        return link;
    }
    

    它将为您提供一个JLabel,其作用类似于一个正确的链接。

    在行动中:

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Linkify Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 100);
        frame.setLocationRelativeTo(null);
        Container container = frame.getContentPane();
        container.setLayout(new GridBagLayout());
        container.add(new JLabel("Click "));
        container.add(linkify("this", "http://facebook.com", "Facebook"));
        container.add(new JLabel(" link to open Facebook."));
        frame.setVisible(true);
    }
    

    如果不需要工具提示,只需发送null。

        9
  •  4
  •   Elist    12 年前

    使用 JEditorPane HyperlinkListener .

        10
  •  1
  •   Magnilex BesaFX    11 年前

    放 window.open(website url)

        11
  •  1
  •   BullyWiiPlaza    11 年前

    JHyperLink 要添加到生成路径。

    JHyperlink stackOverflow = new JHyperlink("Click HERE!",
                    "https://www.stackoverflow.com/");
    
    JComponent[] messageComponents = new JComponent[] { stackOverflow };
    
    JOptionPane.showMessageDialog(null, messageComponents, "StackOverflow",
                    JOptionPane.PLAIN_MESSAGE);
    

    请注意,您可以填写 JComponent 数组中包含更多 Swing 组件。

        12
  •  0
  •   Ingo    10 年前

    actionListener ->  Runtime.getRuntime().exec("cmd.exe /c start chrome www.google.com")`
    

    chrome 具有 iexplore firefox