HyperlinkLabel - Hyperlinks in GUI-Komponenten

Aus Byte-Welt Wiki
(Weitergeleitet von Hyperlinks in GUI-Komponenten)
Zur Navigation springenZur Suche springen

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:

/*
*   Copyright 2014 Gernot Segieth
*
*   Licensed under the Apache License, Version 2.0 (the "License");
*   you may not use this file except in compliance with the License.
*   You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
*   Unless required by applicable law or agreed to in writing, software
*   distributed under the License is distributed on an "AS IS" BASIS,
*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*   See the License for the specific language governing permissions and
*   limitations under the License.
*/

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

}