aktiver Link in einem Dialog

kodela

Bekanntes Mitglied
Hallo,

ich möchte von einem Standard-Dialog aus es dem Anwender ermöglichen, eine bestimmte Internetpage aufzurufen. Das ganze sieht in etwa so aus:

Java:
JOptionPane.showMessageDialog(null,
        "<html>Es gibt zu XYZ die neue Version " + version + ".<br><br>" +
        "Sie kann von <a href=\"http://adresse/index.html\">hier</a> heruntergeladen werden.",
        "Hinweis", 1);

Die Ausgabe im Dialog ist eigentlich so, wie ich es erwarte, der Link ist jedoch irgendwie nicht aktiv. Zumindest tut sich nichts, wenn man ihn anklickt.

Kann mir bitte jemand sagen, was noch zu tun ist, dass dieser Link auch aktiv wird. Danke schon einmal.

Konrad
 
G

Gast2

Gast
Das geht out of the box nicht.

Ich hab sowas aber schonmal geschrieben/umgeschrieben (Zusammengesetzt aus verschiedenen Code Schnipseln die ich zum teil hier im Forum und im Netz gefunden hab)! Hier der Code:

Java:
/**
 * Html capable Label class.
 * 
 * Since Jlabel is capable of html but not of executing Hyperlink Events this
 * class provides extended functionality out of the box.
 * 
 * Its an extended JEditorPane with integrated hyperlink support the way, that
 * it executes Hyperlinks in the host systems default browser.
 * 
 * To complete the task it sets itself to the look of a JLabel.
 * 
 * 
 * @author kaf9tr
 * @see JLabel
 * @see JEditorPane
 */
public class HtmlLabel extends JEditorPane {

    private class MyHyperlinkListener implements HyperlinkListener {

        @Override
        public void hyperlinkUpdate(final HyperlinkEvent evt) {
            final HyperlinkEvent.EventType typ = evt.getEventType();
            if (typ == HyperlinkEvent.EventType.ACTIVATED) {
                try {
                    String urlFF = evt.getURL().toString();
                    urlFF = urlFF.replace("\\", "/");
                    urlFF = urlFF.replace(" ", "%20");
                    Desktop.getDesktop().browse(new URI(urlFF));
                } catch (final IOException ex) {
                    System.err.println("hyperlink not found!"); //TODO Real logging!
                } catch (final URISyntaxException ex) {
                    System.err.println("uri syntax exception!"); //TODO Real logging!
                }
            }
        }
    }

    public HtmlLabel() {
        this("");
    }

    public HtmlLabel(final String htmlText) {
        setContentType("text/html");
        setText(htmlText);
        // add a CSS rule to force body tags to use the default label font
        // instead of the value in javax.swing.text.html.default.csss
        final Font font = UIManager.getFont("Label.font");
        final String bodyRule = "body { font-family: " + font.getFamily() + "; " + "font-size: " + font.getSize()
                + "pt; }";
        ((HTMLDocument) getDocument()).getStyleSheet().addRule(bodyRule);
        setBorder(null);
        setOpaque(false);
        setEditable(false);
        addHyperlinkListener(new MyHyperlinkListener());
        setFocusable(false);
    }
}
 

kodela

Bekanntes Mitglied
Hallo kappesf,

danke für Deinen Hinweis. Habe ich Dich richtig verstanden, dass ich mir meine eigene Dialogklasse schreiben muss, in der ich dann das HtmlLabel einbinden kann?

Konrad
 

Michael...

Top Contributor
Habe ich Dich richtig verstanden, dass ich mir meine eigene Dialogklasse schreiben muss, in der ich dann das HtmlLabel einbinden kann?
Nein, der zweite Parameter der showMessageDialog(...) erwartet ein Objekt. Hier muss nicht unbedingt ein String sondern kann auch eine Komponente übergeben werden. Wie das dann aussieht bleibt abzuwarten ;-)
 
G

Gast2

Gast
Genau Michael hat das richtig erklärt. Du kannst das HTML Label als Komponente übergeben. Musst nur mal schauen ob du für deine Bedürfnisse noch was abändern magst. Geöffnet werden die Links im übrigen im Standardbrowser.
 

kodela

Bekanntes Mitglied
Danke für die Hinweise, es funktioniert prima. Ich habe nur wegen der zwei catch-Abschnitte auch einen zweiten try-Abschnitt hinzugefügt. Damit sind es zwei komplette, ineinander verschachtelte TryCatch Anweisungen.

Eine Frage habe ich noch: Wie bereits erwähnt, wird der Link von einem Dialogfenster aufgerufen (Prüfung auf eine Update-Möglichkeit). Der Anwender kann diesen Dialog beenden, ohne den Link aufzuzrufen. Wenn er aber den Link aufruft, bleibt der Dialog offen.

Seht Ihr eine Möglichkeit, immer dann, wenn der Link aufgerufen wird, das Dialogfenster automatisch zu schließen?

Konrad
 
G

Gast2

Gast
Danke für die Hinweise, es funktioniert prima. Ich habe nur wegen der zwei catch-Abschnitte auch einen zweiten try-Abschnitt hinzugefügt. Damit sind es zwei komplette, ineinander verschachtelte TryCatch Anweisungen.

Wofür?

Eine Frage habe ich noch: Wie bereits erwähnt, wird der Link von einem Dialogfenster aufgerufen (Prüfung auf eine Update-Möglichkeit). Der Anwender kann diesen Dialog beenden, ohne den Link aufzuzrufen. Wenn er aber den Link aufruft, bleibt der Dialog offen.

Seht Ihr eine Möglichkeit, immer dann, wenn der Link aufgerufen wird, das Dialogfenster automatisch zu schließen
Konrad

Du könntest die HTML Label Klasse so erweitern, dass Sie zusätzliche LIstener registriert. Dein Dialog könnte sich so auch als Hyperlink Listener registrieren und entsprechend auf so ein Event reagieren.
 

kodela

Bekanntes Mitglied
@ kappesf

Danke für den neuerlichen Hinweis. Muss mich erst dazu etwas schlauer machen. Könntest Du mir das vielleicht in kurzen Zügen erklären?

Zu der Frage "Wofür?": Ich konnte NetBeans nicht dazu bewegen, sich mit einer try-Anweisung zufrieden zu geben. Es wurde immer ein Fehler gemeldet.

Konrad
 
Zuletzt bearbeitet:
G

Gast2

Gast
Hab gerade gesehen, dass du die Klasse dazu gar nciht erweitern musst.
Erzeuge in deinem Dialog einen anonymen HperLink Listener und füge diesen dem Html Label hinzu. Das sieht dann in etwa so aus:

Java:
        HtmlLabel label = new HtmlLabel();
        label.addHyperlinkListener(new HyperlinkListener() {
            
            @Override
            public void hyperlinkUpdate(HyperlinkEvent arg0) {
                // Hier kommt der Code rein welcher dann vom Dialog ausgeführt werden soll. z.B. ein Dispose  
                DialogKlasse.this.dispose(); //DialogKlasse ist der Name deiner Dialog Klasse. 
            }
        });

Wenn du keine eigene dialog Klasse hast musst du einfach die Referenz auf den Dialog disposen.
 

kodela

Bekanntes Mitglied
Zuerst einmal Danke!

Jetzt zu meinem (funktionierenden) Code:

Java:
HtmlLabel label = new HtmlLabel("<html>Bla bla bla<br><br>" +
        "Sie kann von <a href=\"http://adresse/index.html\">hier</a> heruntergeladen werden.");
JOptionPane.showMessageDialog(null, label, "Hinweis", 1);

Ich habe keine eigene Dialog-Klasse und weiß jetzt nicht, wie ich die Referenz auf JOptionPane disposen soll. Das müsste ja in der HtmlLabel-Klasse geschehen, denn nur dort könnte ich eingreifen. Wie komme ich dort aber zu der Referenz des Dialogs von JOptionPane?

Entschuldige meine Unbeholfenheit, aber Java ist für mich relativ neu.

Konrad
 

Michael...

Top Contributor
Wenn der Dialog beim Klicken des Hyperlinks geschlossen werden soll, wird man wohl nicht um einen eigenen JDialog herumkommen (ist allerdings auch nicht schwer), da man bei den JOptionPane Dialogen m.W. an keine Referenz der erzeugten Dialoge kommt.
 

kodela

Bekanntes Mitglied
Wenn der Dialog beim Klicken des Hyperlinks geschlossen werden soll, wird man wohl nicht um einen eigenen JDialog herumkommen (ist allerdings auch nicht schwer), da man bei den JOptionPane Dialogen m.W. an keine Referenz der erzeugten Dialoge kommt.

Ja, das habe ich mir auch gedacht und das ist sicherlich kein Problem.

Nochmals vielen Dank für die Unterstützung!

Gibt es übrigens eine Erklärung dafür, dass es bei NetBeans offensichtlich zu jedem "catch" auch ein "try" geben muss und von anderen IDEs oder Compilern anscheinend für ein "try" auch mehrere "catch"-Anweisungen akzeptiert werden?

Eigentlich finde ich das Verhalten von NetBeans logisch, aber was richtig ist und was nicht, dürfte doch nicht die IDE bestimmen. Was ist nun bei Java diesbezüglich richtig?

Konrad
 
G

Gast2

Gast
Lauf Java Konventionen sollte immer ein try mehrere cach akzeptieren.

Und natürlich kannst du auf den Hyperlink Event auch extern reagieren. Wie gesagt du musst innerhalb der Dialogklasse einen weiteren Hyperlink Listener beim HTML Label registrieren. Dieser disposed dann anstatt den Link zu öffnen!

wie das geht habe ich ja schon geschrieben.
 

kodela

Bekanntes Mitglied
Danke kappesf,

mittlerweile läuft Dank Eurer Hilfe bei mir alles so, wie ich es wollte.

An Stelle von JOptionPane habe ich mir eine eigene Klasse geschrieben und dort ein HtmlLabel eingefügt.

Im überschriebenen hyperlinkUpdate wird nach dem Aufruf von

Desktop.getDesktop().browse(new URI(urlFF));

für die aufrufende Dialogklasse zuerst visible auf false gesetzt und danach mit despose aufgeräumt. Ohne dem

setVisible(false);

geht jedoch nichts, aber auf dispose() könnte man verzichten.

Was "try" und "catch" anbelangt, habe ich in der mir zugänglichen Literatur nichts gefunden. Hast Du eine Quelle, die dazu etwas hergibt?

Nochmals Danke an alle die mir geholfen haben,

Konrad
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Zahl aktiver Threads einer Gruppe verlässlich abfragen Allgemeine Java-Themen 3
J Class to link Java Allgemeine Java-Themen 4
G Maven link outdated Allgemeine Java-Themen 13
S Link element an vorletzte stelle einfügen Allgemeine Java-Themen 2
D HTTP Http-Link mittels GUI schreiben Allgemeine Java-Themen 5
M redirected link Allgemeine Java-Themen 11
G Datei per Drag and Drop auf den Link öffnen Allgemeine Java-Themen 6
T Youtube Link Allgemeine Java-Themen 4
F.S.WhiTeY JDK installieren Linux: Nach Update link auf Java zerschossen Allgemeine Java-Themen 4
F Parameter im Link /jar-Aufruf Allgemeine Java-Themen 12
T Link zum Internet Allgemeine Java-Themen 12
M Autostart: Registry oder Link? Allgemeine Java-Themen 6
S regex für einen Link Allgemeine Java-Themen 3
H File Attribut bzw Link erkennen Allgemeine Java-Themen 5
F Link in Applet "verstecken" Allgemeine Java-Themen 3
Nicer Problem mit Link aufruf Allgemeine Java-Themen 6
W Webseite öffnen und Link anklicken Allgemeine Java-Themen 2
P Link in einem ausgewählten Browser öffnen Allgemeine Java-Themen 10
A Überprüfen, ob ein File eine Verknüpfung / Link ist Allgemeine Java-Themen 3
S Link im Browser öffnen Allgemeine Java-Themen 10
S E-Mail-Links: geklickten Link ermitteln Allgemeine Java-Themen 4
S mailto-Link in MessageBox Allgemeine Java-Themen 17
B Browser link aus Java-Applikation öffnen Allgemeine Java-Themen 2
J JSP, Link nur bei erfüllter Bedingung anzeigen Allgemeine Java-Themen 6
J JSP Client LInk einbauen Allgemeine Java-Themen 15
M Link parsen bzw. zerlegen Allgemeine Java-Themen 9
Q || Wie speichert man Dateien wo der Pfad als Link(UNIX)... Allgemeine Java-Themen 11
G http:// in Link umwandeln Allgemeine Java-Themen 14
D Linux Link wird als Ordner interpretiert? Allgemeine Java-Themen 2
S Mauszeiger beim Link! Allgemeine Java-Themen 22
M HTML Link Fehler Allgemeine Java-Themen 5
G Html Link in einem JLabel? Allgemeine Java-Themen 3
G Link zu JCreator oder anderem Tool Allgemeine Java-Themen 2
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
P Feststellen, Welche Classes ich aus einem JAR nutze? Allgemeine Java-Themen 6
Jose05 mit 2 - 3 Personen an einem Projekt coden Allgemeine Java-Themen 2
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
Jose05 Speicherung auf einem Server Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
alinakeineAhnungv Hilfe bei einem Straßenbahn-Projekt von mir Allgemeine Java-Themen 18
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
Thallius Zeitzone zu einem LocalDate hinzufügen aber ohne es zu ändern... Allgemeine Java-Themen 2
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
Zrebna DeleteNode-Funktionalität in einem AVL-Tree Allgemeine Java-Themen 5
pkm Warnungen in einem Drools-Projekt unterdrücken? Allgemeine Java-Themen 1
D Arbeiten mit einem Bitarray Allgemeine Java-Themen 13
D Union in einem Struct in JNA Allgemeine Java-Themen 5
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
R Zoom In einem grid Allgemeine Java-Themen 0
M java.io.EOFException bei einem DataoutputStream ?! Allgemeine Java-Themen 2
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Fahrtsimulation von einem Zug Allgemeine Java-Themen 0
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
K Bild in einem anderen Bild suchen Allgemeine Java-Themen 12
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
R Farbe zu einem Eckpunkt generieren Allgemeine Java-Themen 0
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
X Punkte in einem Feld bestimmen Allgemeine Java-Themen 22
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
Sin137 OOP Auf JPanel zugreifen, das einem JTabbePane hinzugefügt worden ist Allgemeine Java-Themen 10
E Die if-Anweisung in einer Java Bean bzw. in einem Servlet? Allgemeine Java-Themen 8
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
M Ein Programm das nur von einem bestimmten Programm geöffnet werden kann Allgemeine Java-Themen 7
H Klammerberechnungen bei einem Taschenrechner Allgemeine Java-Themen 2
S Kann man mit einem GeneralPath.curveTo ein GeneralPath.quadTo ersetzen..? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben