Saltar al contenido

¿Cómo agregar hipervínculo en JLabel?

Ya no busques más en otros sitios ya que estás al espacio adecuado, poseemos la respuesta que deseas pero sin complicaciones.

Solución:

Puede hacer esto usando un JLabel, pero una alternativa sería diseñar un JButton. De esa forma, no tienes que preocuparte por la accesibilidad y solo puedes disparar eventos usando un 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 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 */ 
  

Me gustaría ofrecer otra solución. Es similar a los ya propuestos, ya que usa código HTML en un JLabel y registra un MouseListener en él, pero también muestra un HandCursor cuando mueves el mouse sobre el enlace, por lo que la apariencia es como la que la mayoría de los usuarios esperarían. . Si la navegación no es compatible con la plataforma, no se crea ningún enlace HTML subrayado en azul que pueda engañar al usuario. En cambio, el enlace se presenta como texto sin formato. Esto podría combinarse con la clase SwingLink propuesta por @ 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 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 

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


Escribí un artículo sobre cómo configurar un hipervínculo o un mailto en un jLabel.

Así que inténtalo:

Creo que eso es exactamente lo que estás buscando.

Aquí está el ejemplo de código completo:

/**
 * 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(" 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 
        );
    

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

Te mostramos las comentarios y valoraciones de los lectores

Si posees algún recelo o capacidad de renovar nuestro tutorial te invitamos ejecutar una interpretación y con mucho placer lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *