HyperlinkLabel - Hyperlinks in GUI-Komponenten

Aus Byte-Welt Wiki
Wechseln zu: Navigation, Suche

Gelegentlich kommt es vor, dass wir in einer Benutzeroberfläche eines Java-Programms Hyperlinks zu Web-Inhalten oder E-Mail-Adressen per Text- oder Bild-Link bereit stellen möchten.
Häufig kann man das auch in bekannter Software sehen, dass innerhalb einer Benutzeroberfläche Weblinks zu Internet-Resourcen eingebaut wurden.

HyperlinkLabel.png

Doch wie kann man nun eine solche Funktionalität in einer Java-Anwendung mit Swing bereit stellen? Im nachfolgenden Code wird dazu die Klasse javax.swing.JLabel erweitert. Es erscheint am naheliegensten, weil mit JLabels recht unkompliziert auch Bilder dargestellt werden können. Somit wären auch verlinkte Bilder und Grafiken innerhalb der GUI einer Java-Anwendung denkbar.

Folgende fertige Komponente wird dies erledigen können:

import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import javax.swing.JLabel;
import javax.swing.Icon;
 
/**
 * HyperlinkLabel dient zur Bereitstellung von Hyperlinks mit entsprechendem
 * Verhalten in einem JLabel-Typ.
 * @author Gernot Segieth (L-ectron-X, Kontakt per PN auf byte-welt.net)
 */
public class HyperlinkLabel extends JLabel implements MouseListener {
 
    private URL url;
    protected final static Cursor HAND_CURSOR = new Cursor(Cursor.HAND_CURSOR);
    protected final static Cursor DEFAULT_CURSOR = new Cursor(Cursor.DEFAULT_CURSOR);
 
    /**
     * Erzeugt ein leeres HyperLinkLabel.
     * @see javax.swing.JLabel()
     */
    public HyperlinkLabel() {
        addMouseListener(this);
    }
 
    /**
     * Erzeugt ein neues HyperLinkLabel, welches den Textinhalt für den Hyperlink
     * aus der übergebenen URL entnimmt.
     * @param url Die URL, die als Hyperlink und Textinhalt verwendet werden soll.
     * @see javax.swing.JLabel(java.lang.String)
     */
    public HyperlinkLabel(URL url) {
        this(url.toString(), url);
    }
 
    /**
     * Erzeugt ein neues HyperLinkLabel, welches das übergebene Bild mit der
     * übergebenen URL verlinkt.
     * @param image Das Bild, das angezeigt werden soll.
     * @param url Die URL, mit der das Bild verlinkt werden soll.
     * @see javax.swing.JLabel(javax.swing.Icon)
     */
    public HyperlinkLabel(Icon image, URL url) {
        super(image);
        this.url = url;
        addMouseListener(this);
    }
 
    /**
     * Erzeugt ein neues HyperlinkLabel, welches das übergebene Bild mit der 
     * übergebenen URL verlinkt und den Inhalt horizontal auf der Komponente
     * nach dem Wert des Alignments ausrichtet.
     * @param image Das Bild, das angezeigt werden soll.
     * @param horizontalAlignment Das Attribut zum horizontalen Ausrichten des Inhaltes.
     * @param url Die URL, mit der das Bild verlinkt werden soll.
     * @see javax.swing.JLabel(javax.swing.Icon, int)
     */
    public HyperlinkLabel(Icon image, int horizontalAlignment, URL url) {
        this(image, url);
        setHorizontalAlignment(horizontalAlignment);
    }
 
    /**
     * Erzeugt ein neues HyperlinkLabel, welches eine URL und einen beschreibenden
     * Text für den Hyperlink entgegennimmt.
     * @param text Der Hyperlink-Text.
     * @param url Die URL, mit der der Text verlinkt werden soll.
     * @see javax.swing.JLabel(java.lang.String)
     */
    public HyperlinkLabel(String text, URL url) {
        super("<html><a href=\""+url.toString()+"\">"+text+"</a></html>");
        this.url = url;
        addMouseListener(this);
    }
 
    /**
     * Erzeugt ein neues HyperlinkLabel, einen beschreibenden Text für den Hyperlink
     * und ein Bild mit der übergebenen URL verlinkt. Der Inhalt wird dabei horizontal 
     * auf der Komponente nach dem Wert des Alignments ausrichtet.
     * @param text Der Hyperlink-Text.
     * @param image Das Bild, das angezeigt werden soll.
     * @param horizontalAlignment Das Attribut zum horizontalen Ausrichten des Inhaltes.
     * @param url Die URL, mit der der Text und das Bild verlinkt werden sollen.
     * @see javax.swing.JLabel(java.lang.String, javax.swing.Icon, int)
     */
    public HyperlinkLabel(String text, Icon image, int horizontalAlignment, URL url) {
        this(text, horizontalAlignment, url);
        setIcon(image);
    }
 
    /**
     * Erzeugt ein neues HyperlinkLabel, welches eine URL und einen beschreibenden
     * Text für den Hyperlink entgegennimmt. Der Inhalt wird dabei horizontal 
     * auf der Komponente nach dem Wert des Alignments ausrichtet.
     * @param text Der Hyperlink-Text.
     * @param horizontalAlignment Das Attribut zum horizontalen Ausrichten des Inhaltes.
     * @param url Die URL, mit der der Text verlinkt werden soll.
     * @see javax.swing.JLabel(java.lang.String, int)
     */
    public HyperlinkLabel(String text, int horizontalAlignment, URL url) {
        this(text, url);
        setHorizontalAlignment(horizontalAlignment);
    }    
 
    /**
     * Gibt die derzeit gesetzte URL des HyperlinkLabels zurück, mit der die
     * Inhalte verlinkt sind.
     * @return Die verlinkte URL.
     */
    public URL getURL() {
        return url;
    }
 
    /**
     * Setzt eine neue URL, mit der das HyperlinkLabel verlinkt werden soll.
     * @param url Die URL zur Verlinkung der Inhalte des HyperlinkLabels.
     */
    public void setURL(URL url) {
        this.url = url;
    }    
 
    /**
     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) 
     */
    @Override
    public void mouseClicked(MouseEvent e) {
        if (Desktop.isDesktopSupported()) {
            try {
                Desktop.getDesktop().browse(url.toURI());
            } catch (MalformedURLException ex) {
                System.err.println(ex);
            } catch (URISyntaxException ex) {
                System.err.println(ex);
            } catch (IOException ex) {
                System.err.println(ex);
            }
        }
    }
 
    /**
     * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent) 
     */
    @Override
    public void mousePressed(MouseEvent e) {
 
    }
 
    /**
     * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent) 
     */
    @Override
    public void mouseReleased(MouseEvent e) {
 
    }
 
    /**
     * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent) 
     */
    @Override
    public void mouseEntered(MouseEvent e) {
        setCursor(HyperlinkLabel.HAND_CURSOR);
    }
 
    /**
     * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent) 
     */    
    @Override
    public void mouseExited(MouseEvent e) {
        setCursor(HyperlinkLabel.DEFAULT_CURSOR);
    }
 
}