Link in Netbeans‘ JDialog

Oft entsteht der Wunsch einen Link auf die Homepage oder die eigene E-Mailadresse in z.B das Infodialogfenster des eigenen Java Programms zu setzen.

Leider ist es nicht so einfach, wie man anfangs denkt, da Javas Swing keine entsprechendes Widget für URIs enthält. Man kann aber ein JLabel entsprechend konfigurieren.

Dieses How-To zeigt Schritt für Schritt, wie man in Netbeans aus einem JLabel einen URI-Link macht und ihn in ein JDialog einbettet.

Die nachfolgende Anleitung ist sehr ausführlich und richtet sich an Anfänger.

JDialog und JLabel anlegen

Lege ein neues Java Application Projekt an:

Netbeans - Java Application auswählen

Unter „File| New…“ wird unter „Categories | Swing GUI Forms“ ein neues JDialog Form angelegt. Ich habe es LinkDialog genannt:

etbeans - JDialog auswählern

Im sich öffnenden Fenster sollte die Design Ansicht aktiviert sein und im rechten Panel mit dem Namen Palette zieht man aus dem Bereich Swing Controls ein JLabel auf die graue JDialog Fläche und positioniert sie nach Wunsch:

Netbeans - JLabel auf JDialog ziehen

Jlabel konfigurieren

Setze den Fokus auf das JLabels, indem du in der Designansicht oder im unteren linken Navigator-Bereich auf das JLabel klickst. Bei Erfolg erscheinen 8 Anfasser um das JLabel-Objekt. Im rechten Panel mit dem Namen Properties klicke oben auf den gleichnamigen Button Properties. Suche dort den Eintrag text und klicke in der gleichen Zeile rechts auf den kleinen Button mit den 3 Punkten:

Netbeans - JLabel-Text ändern

Trage in den sich öffnenden Dialog folgenden Text ein. Statt „Homepage“ kannst du einen beliebigen Text angeben:

Netbeans - HTML für Link

Dieser erscheint blau und unterstrichen als Textlink in dem JDialog. Die entsprechende URI (Homepage- oder E-Mailadresse) wird später im Programmcode angegeben:

etbeans - JLabel-Text fertig

Event-Listener hinzufügen

Im rechten Panel Properties klicke oben auf Events. Scrolle die Liste bis zum Eintrag mouseClicked herunter. In der gleichen Zeile klicke rechts auf das kleines Dreieck, das nach unten zeigt. Wähle den ersten und einzigen Eintrag aus:

Netbeans - Events

Danach springt Netbeans automatisch in die Ansicht Source und direkt an die Stelle, an der das entsprechende Event implementiert werden muss. Trage im Body der Methode die Zeile: openURI(uri); ein. Das rote Ausrufezeichen weist auf einen Fehler hin, da wir die Methode openURI noch nicht implementiert haben.

Zwar könnten wir schon hier die Funktion direkt implementieren, aber indem wir sie in eine Methode auslagern, lässt sie sich mehrfach verwenden, z.B. für mehrere Hompage- oder eine Service-E-Mail-Adresse.

Nun implementieren wir die Methode openURI. Füge folgenden Text in den Code ein:

private static void openURI(URI uri) {
    if (Desktop.isDesktopSupported()) {
        try {
            Desktop.getDesktop().browse(uri);
        } catch (IOException e) { System.err.println(e.toString()); }
    } else { 
        System.err.println("ERROR: 'Desktop.isDesktopSupported()' is 'FALSE'"); 
    }
}

Die Hinweise auf der linken Seite weisen in unserem Fall auf fehlende Importe hin. Klicke auf die Glühbirnen mit den roten Ausrufezeichen und dann auf „Add import for […]“.

Zusätzlich müssen wir noch die Variable uri spezifizieren. Das kann man als Klassenvariable tun. Füge URI uri; nach

public class LinkDialog extends javax.swing.JDialog {

und vor dem Konstruktor

public LinkDialog(java.awt.Frame parent, boolean modal) {

ein:

Auch hier müssen fehlende Importe nachgetragen werden:

Nun müssen wir die eigentliche URI spezifizieren. Das erledigen wir im Konstruktor.  Füge folgenden Code im Kontruktor (hier: public LinkDialog(…) { zwischen super und initComponents ein:

try {
    uri = new URI("https://netbeans.org/");
} catch (URISyntaxException ex) {
    System.err.println(ex.toString);
}

nb-link12

Statt https://netbeans.org/ kannst du jede beliebige Adresse eintragen. Wenn du eine E-Mail-Adresse verlinken willst, trage mailto: vor deiner E-Mail ein, z.B.  mailto:meinemail@ich.de.

Damit wären wir eigentlich schon fertig.

Userexperience verbessern

Da Anwender aber erwarten, dass sich der Mauszeiger beim Überfahren eines Links ändert, müssen wir noch nacharbeiten. Wir wählen die Ansicht Design und rechts das Panel Properties.

Screenshot Netbeans

Dort klicken wir auf Events und scrollen herunter bis auf den Eintrag mouseEntered. Beim Klick auf das Dreieck und die Auswahl der vorgeschlagenen Methode, springt Netbeans wieder automatisch in die Ansicht Source an die Stelle des zu implementierenden Listners. Dort geben wir die die Anweisung den Mauscursor als Hand mit ausgestrecktem Zeigefinger darzustellen:

setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

Da sich natürlich der Mauszeiger nach dem Überfahren des Links wieder in seine Standardform wandeln sollte, gehen wir wieder in die Designansicht und legen das Event mouseExited genauso an, wie vorher mouseEntered. Der Code unterscheidet sich nur marginal:

setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

Netbeans Screenshoot

Fertiges Projekt starten

Jetzt sind wir fertig, speichern unser Projekt und können es durch Drücken der Taste F6 starten. Wir quittieren ggf. die Nachfrage nach der Hauptklasse:

etbeans - Main Class wählen

und können unseren Link ausprobieren:

etbeans - Fertiger Link auf JDialog

Einen JDialog in ein bestehendes Projekt einfügen

Siehe mein Tutorial JDialog in Netbeans, wenn du Hilfe brauchst.

Download

Zum Nachverfolgen habe ich dieses Beispiel als gezipptes Netbeans-Projekt hier zum Download bereitgestellt.

Es kann einfach über „Import Project | From ZIP …“ importiert werden.

Hinweis: Die LinkDialog-Klasse befindet sich im Standardpackage. Das ist kein guter Stil, macht es aber für ein Beispiel einfacher. Desweiteren habe ich die vorgegebenen Namen für Komponenten, wie JLabel1 einfach übernommen, statt sprechende Namen (z.B. lbLink) zu verwenden.

Bildnachweis

Netbeans Screenshot: CC0 - Public Domain (CC0)


Ein Kommentar

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert