How to add hyperlink in JLabel?

JavaSwingHyperlinkJlabel

Java Problem Overview


What is the best way to add a hyperlink in a JLabel? I can get the view using html tags, but how to open the browser when the user clicks on it?

Java Solutions


Solution 1 - Java

You can do this using a JLabel, but an alternative would be to style a JButton. That way, you don't have to worry about accessibility and can just fire events using an 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 */ }
  }

Solution 2 - Java

I'd like to offer yet another solution. It's similar to the already proposed ones as it uses HTML-code in a JLabel, and registers a MouseListener on it, but it also displays a HandCursor when you move the mouse over the link, so the look&feel is just like what most users would expect. If browsing is not supported by the platform, no blue, underlined HTML-link is created that could mislead the user. Instead, the link is just presented as plain text. This could be combined with the SwingLink class proposed by @dimo414.

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);
		}
	});
}
}

Solution 3 - Java

I wrote an article on how to set a hyperlink or a mailto on a jLabel.

So just try it :

I think that's exactly what you're searching for.

Here's the complete code example :

/**
 * 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=\"\">[email protected]</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:[email protected]?subject=TEST"));
				} catch (URISyntaxException | IOException ex) {
					//It looks like there's a problem
				}
			}
		});
	}
}

Solution 4 - Java

Update I've tidied up the SwingLink class further and added more features; an up-to-date copy of it can be found here: https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java


@McDowell's answer is great, but there's several things that could be improved upon. Notably text other than the hyperlink is clickable and it still looks like a button even though some of the styling has been changed/hidden. While accessibility is important, a coherent UI is as well.

So I put together a class extending JLabel based on McDowell's code. It's self-contained, handles errors properly, and feels more like a link:

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);
    }
  }
}

You could also, for instance, change the link color to purple after being clicked, if that seemed useful. It's all self contained, you simply call:

SwingLink link = new SwingLink("Java", "http://java.sun.com");
mainPanel.add(link);

Solution 5 - Java

Maybe use JXHyperlink from SwingX instead. It extends JButton. Some useful links:

Solution 6 - Java

You might try using a JEditorPane instead of a JLabel. This understands basic HTML and will send a HyperlinkEvent event to the HyperlinkListener you register with the JEditPane.

Solution 7 - Java

If <a href="link"> doesn't work, then:

  1. Create a JLabel and add a MouseListener (decorate the label to look like a hyperlink)
  2. Implement mouseClicked() event
  3. In the implementation of mouseClicked() event, perform your action

Have a look at java.awt.Desktop API for opening a link using the default browser (this API is available only from Java6).

Solution 8 - Java

I know I'm kinda late to the party but I made a little method others might find cool/useful.

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;
}

It'll give you a JLabel that acts like a proper link.

In action:

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);
}

If you'd like no tooltip just send a null.

Hope someone finds this useful! (If you do, be sure to let me know, I'd be happy to hear.)

Solution 9 - Java

Use a JEditorPane with a HyperlinkListener.

Solution 10 - Java

Just put window.open(website url), it works every time.

Solution 11 - Java

The following code requires JHyperLink to be added to your build path.

JHyperlink stackOverflow = new JHyperlink("Click HERE!",
				"https://www.stackoverflow.com/");

JComponent[] messageComponents = new JComponent[] { stackOverflow };

JOptionPane.showMessageDialog(null, messageComponents, "StackOverflow",
				JOptionPane.PLAIN_MESSAGE);

Note that you can fill the JComponent array with more Swing components.

Result:

Solution 12 - Java

You can use this under an

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

or if you want to use Internet Explorer or Firefox replace chrome with iexplore or firefox

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionamitView Question on Stackoverflow
Solution 1 - JavaMcDowellView Answer on Stackoverflow
Solution 2 - JavaStefanView Answer on Stackoverflow
Solution 3 - JavaibrabelwareView Answer on Stackoverflow
Solution 4 - Javadimo414View Answer on Stackoverflow
Solution 5 - JavaKaarelView Answer on Stackoverflow
Solution 6 - JavaEdward FalkView Answer on Stackoverflow
Solution 7 - JavaSrikanthView Answer on Stackoverflow
Solution 8 - JavamoomoohkView Answer on Stackoverflow
Solution 9 - JavaElistView Answer on Stackoverflow
Solution 10 - Javathisis fakeView Answer on Stackoverflow
Solution 11 - JavaBullyWiiPlazaView Answer on Stackoverflow
Solution 12 - JavaIonutz AsafteiView Answer on Stackoverflow