En JAVA, voyons comment ajouter les comportements suivants:
1. sousligner le texte au survol de la souris,
2. changer le curseur de la souris,
3. ouvrir l'url dans un navigateur internet.
Ajouter des evenements au JLabel
L'idéal serait d'étendre un composant JLabel et d'y ajouter les fonctionnalités d'un lien hypertexte. Pour simplifier, l'exemple se base sur un JFrame et la création d'un JLabel ayant les propriétés d'un lien. Ainsi, il suffit de lancer la class pour visualiser l'effet de survol et l'ouverture de l'URL dans un navigateur internet.
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* Ajouter un lien hypertexte à un JLabel
*
* @author Axel 2013
* @see http://www.fobec.com/java/1131/ajouter-lien-hypertexte-jlabel.html
*/
public class JLabelHyperlink extends JFrame {
/**
* Constructor
*/
public JLabelHyperlink() {
//JFrame
this.setTitle("Exemple de lien hypertexte");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
//JLabel
JLabel lb_url = new JLabel();
lb_url.setText("http://www.fobec.com");
lb_url.setCursor(new Cursor(Cursor.HAND_CURSOR));
addListener(lb_url);
JPanel panel = new JPanel();
panel.add(lb_url);
getContentPane().add(panel);
}
/**
* Listener sur le JLabel
* @param lb_url
*/
private void addListener(JLabel lb_url) {
lb_url.addMouseListener(new MouseAdapter() {
//Click sur le lien
public void mouseClicked(MouseEvent e) {
JLabel label=(JLabel)e.getSource();
String plainText = label.getText().replaceAll("\<.*?\>", "");
try {
Desktop.getDesktop().browse(new URI(plainText));
} catch (URISyntaxException ex) {
Logger.getLogger(JLabelHyperlink.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(JLabelHyperlink.class.getName()).log(Level.SEVERE, null, ex);
}
}
//Survol sur le lien
public void mouseEntered(MouseEvent e) {
JLabel label=(JLabel)e.getSource();
String plainText = label.getText().replaceAll("\<.*?\>", "");
//Sousligner le texte
String urlText="<html><u>"+plainText+"</u></html>";
label.setText(urlText);
}
//Quitte la zone du lien
public void mouseExited(MouseEvent e) {
JLabel label=(JLabel)e.getSource();
String plainText = label.getText().replaceAll("\<.*?\>", "");
//Texte sans souslignage
String urlText="<html>"+plainText+"</html>";
label.setText(urlText);
}
});
}
/**
* Exemple
* @param args
*/
public static void main(String args[]) {
JLabelHyperlink jLabelHyperlink = new JLabelHyperlink();
jLabelHyperlink.setVisible(true);
}
}
L'utilisation de replaceAll("\<.*?\>", "") est une bidouille pour retirer les balises HTML du texte.