Как добавить гиперссылку в JLabel

Каков наилучший способ добавить гиперссылку в jLabel? Я могу получить представление с помощью html-тегов, но как открыть браузер, когда пользователь нажимает на него?

Вы можете сделать это с помощью JLabel , но альтернативой будет стиль JButton . Таким образом, вам не нужно беспокоиться о доступности и просто запускать события с помощью 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("Click the https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link" + " to go to the Java website."); 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 */ } } 

Я хотел бы предложить еще одно решение. Он похож на уже предложенный, поскольку он использует HTML-код в JLabel и регистрирует MouseListener на нем, но он также отображает HandCursor, когда вы перемещаете мышь по ссылке, поэтому внешний вид похож на то, что ожидало большинство пользователей , Если просмотр не поддерживается платформой, не создается синяя подчеркнутая HTML-ссылка, которая может ввести пользователя в заблуждение. Вместо этого ссылка просто представлена ​​как простой текст. Это может сочетаться с classом SwingLink, предложенным @ 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 = ""; private static final String HREF_END = ""; private static final String HTML = ""; private static final String HTML_END = ""; public JLabelLink() { setTitle("HTML https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/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(https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/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 { 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 https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/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 https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/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); } }); } } 

Я написал статью о том, как установить гиперссылку или mailto в jLabel.

Так что просто попробуйте:

Я думаю, это именно то, что вы ищете.

Вот полный пример кода:

 /** * Example of a jLabel Hyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link 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(" contact : [email protected]"); contact.setCursor(new Cursor(Cursor.HAND_CURSOR)); website.setText(" Website : http://www.google.com/"); 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 } } }); } } - /** * Example of a jLabel Hyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link 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(" contact : [email protected]"); contact.setCursor(new Cursor(Cursor.HAND_CURSOR)); website.setText(" Website : http://www.google.com/"); 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 } } }); } } - /** * Example of a jLabel Hyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link 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(" contact : [email protected]"); contact.setCursor(new Cursor(Cursor.HAND_CURSOR)); website.setText(" Website : http://www.google.com/"); 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 } } }); } } 

Возможно, вместо этого используйте JXHyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link от SwingX . Это расширяет JButton . Некоторые полезные ссылки:

  • Класс JXHyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link
  • SwingX: рассмотрим JXHyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link как альтернативу кнопкам

Обновление. Теперь я SwingLink class SwingLink и добавил больше возможностей; обновленную копию можно найти здесь: https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java


@ Ответ Макдауэлла велик, но есть несколько вещей, которые можно улучшить. В частности, текст, отличный от гиперссылки, можно щелкнуть, и он по-прежнему выглядит как кнопка, хотя некоторые элементы стиля были изменены / скрыты. Хотя доступность важна, также существует согласованный пользовательский интерфейс.

Поэтому я собрал class, расширяющий JLabel на основе кода Макдауэлла. Он самодостаточен, правильно обрабатывает ошибки и больше похож на ссылку:

 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 https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link = ul ? ""+text+"" : text; super.setText(""+ https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link+""); 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 https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link, your computer is likely misconfigured.", "Cannot Launch Link",JOptionPane.WARNING_MESSAGE); } } else { JOptionPane.showMessageDialog(null, "Java is not able to launch https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/links on your computer.", "Cannot Launch Link", JOptionPane.WARNING_MESSAGE); } } } 

Вы также можете, например, изменить цвет ссылки на фиолетовый после щелчка, если это окажется полезным. Это все самодостаточно, вы просто звоните:

 SwingLink https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link = new SwingLink("Java", "http://java.sun.com"); mainPanel.add(https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link); 

Вы можете попробовать использовать JEditorPane вместо JLabel. Это понимает базовый HTML и отправляет событие Hyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/linkEvent в Hyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/linkListener, который вы регистрируете с помощью JEditPane.

Если не работает, тогда:

  1. Создайте JLabel и добавьте MouseListener (украсьте ярлык, чтобы он выглядел как гиперссылка)
  2. Внедрение события mouseClicked ()
  3. В реализации события mouseClicked () выполните действие

Посмотрите на java.awt.Desktop API для открытия ссылки с использованием браузера по умолчанию (этот API доступен только с Java6).

Я знаю, что я немного опаздываю на вечеринку, но я сделал небольшой метод, который другие могли бы найти круто / полезно.

 public static JLabel https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-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 https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link = new JLabel(); https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link.setText(""+text+""); if(!toolTip.equals("")) https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link.setToolTipText(toolTip); https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link.setCursor(new Cursor(Cursor.HAND_CURSOR)); https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link.addMouseListener(new MouseListener() { public void mouseExited(MouseEvent arg0) { https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link.setText(""+text+""); } public void mouseEntered(MouseEvent arg0) { https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link.setText(""+text+""); } 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 https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link."); JDialog dialog = pane.createDialog(new JFrame(), ""); dialog.setVisible(true); } } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }); return https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/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(https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/linkify("this", "http://facebook.com", "Facebook")); container.add(new JLabel(" https://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link to open Facebook.")); frame.setVisible(true); } 

Если вы не хотите, чтобы всплывающая подсказка просто послала нуль.

Надеюсь, кто-то найдет это полезным! (Если вы это сделаете, обязательно сообщите мне, я буду рад услышать.)

Используйте JEditorPane с Hyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/linkListener .

Просто поместите window.open(website url) , он работает каждый раз.

Следующий код требует, чтобы JHyperLink добавлялся к вашему пути сборки.

 JHyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link stackOverflow = new JHyperhttps://stackoverflow.com/questions/527719/how-to-add-hyperlink-in-jlabel/link("Click HERE!", "https://www.stackoverflow.com/"); JComponent[] messageComponents = new JComponent[] { stackOverflow }; JOptionPane.showMessageDialog(null, messageComponents, "StackOverflow", JOptionPane.PLAIN_MESSAGE); 

Обратите внимание, что вы можете заполнить массив JComponent большим количеством компонентов Swing .

Результат:

Вы можете использовать это под

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

или если вы хотите использовать Internet Explorer или Firefox, замените chrome на iexplore или firefox

  • Как создать ссылки в текстовом клиенте?
  • Связывание значения столбца в jqGrid с новой страницей с помощью GET
  • Что такое синтаксис RTF для гиперссылки?
  • Пример использования гиперссылки в WPF
  • Как сохранить: активный стиль css после нажатия элемента
  • Facebook share link - можете ли вы настроить текст сообщения?
  • Удалить упорное подчеркивание ссылки
  • Использование jQuery для программного перехода по ссылке
  • Interesting Posts

    Как эффективно сочетать носки с кучей?

    Синхронизация конструктора в Java

    Тройная загрузка Windows 8 Consumer Preview с Windows 7 и Ubuntu 11.10

    Android-хост и скрытые устройства USB

    Не удалось найти соответствующий навигационный случай с идентификатором-view-id ‘/pages/index.xhtml’

    Перенаправление по опции выбора в поле выбора

    java.lang.IllegalStateException: Не удалось найти резервную копию для фабрики javax.faces.application.ApplicationFactory

    Фильтрация нескольких значений в столбце строки в dplyr

    Где посмотреть, какая версия Firefox работает? (64-битный или 32-разрядный)

    Пакетный файл, который запускает команду cmd.exe, команду, а затем остается открытым в приглашении

    Когда fragment fragmentа с SwipeRefreshLayout во время обновления, fragment замерзает, но на самом деле все еще работает

    В чем разница между ++ i и i ++?

    Как ограничить модификацию данных Firebase?

    Любые идеи, почему я получаю задержку после нажатия «Сохранить как» или «Загрузить» в Google Chrome

    Запутывание разделов Fedora на новой установке

    Давайте будем гением компьютера.