JTextPane und Hyperlink (ohne JEditorPane)

it07006

Mitglied
Hallo,

ich muss im Rahmen meines Studiums einen kleinen HTML Browser in Java schreiben. Bisher funktioniert alles bis auf das Hinzufügen eines Hyperlinks in meine JTextPane. (Ich weiß die JEditorPane kann html schon nativ aber die dürfen wir für das Projekt nicht verwenden). Ich habe schon viel gegoogelt und auch hier im Forum gesucht, allerdings nichts zum Laufen bekommen. Kann mir jemand weiterhelfen?

Mein Ansatz:
Java:
	public void addHyperlink(String url, String text) {
		  try {
		    // First, setup the href attribute for <A> tag.
		    SimpleAttributeSet hrefAttr = new SimpleAttributeSet();
		    hrefAttr.addAttribute(HTML.Attribute.HREF, url);

		    // Second, setup the <A> tag
		    SimpleAttributeSet attrs = new SimpleAttributeSet();
		    attrs.addAttribute(HTML.Tag.A, hrefAttr);
		    // Add the text along with its attributes.
		    setText(attrs, text);
		  }
		  catch (BadLocationException e) {
		    e.printStackTrace(System.err);
		  }        
		}

Gruß
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Hallo, du könntest es wie folgt machen (ich habe etwas sehr ähnliches mal machen müssen...):
Java:
public void addHyperlink(String url, String text) 
{
    try 
    {
        String insertText = text;
        if (text == null || text.isEmpty())
            insertText = url;

        SimpleAttributeSet urlAttrs = new SimpleAttributeSet();
        urlAttrs.addAttribute(HTML.Attribute.HREF, url);

        StyleConstants.setForeground(urlAttrs, Color.blue);
        StyleConstants.setFontUnderline(urlAttrs, true);

        myDocument.insertString(
            myDocument.getLength(),
            insertText,
            urlAttrs);
    }
    catch (BadLocationException e) 
    {}        
}
Das sorgt dafür, dass ein Link wie ein Link aussieht, sofern
Code:
myDocument
das Dokument deiner Textpane ist.
ABER, das sorgt noch nicht für das gewohnte Verhalten. Das musst du -vermutlich- selbst programmieren.
Auch hierzu hätte ich etwas, das über MouseListener arbeitet. Ich weiß aber nicht, ob es wirklich das ist, was du willst.
 

it07006

Mitglied
Hallo KrokoDiehl,

schonmal vielen Dank für deine Antwort. Die Lösung über den MouseListener würde mich auch interessieren, es wäre genau das, was ich suche. Also wenn du das auch noch posten könntest, wäre ich dir sehr dankbar.

Gruß
 

KrokoDiehl

Top Contributor
Ok, hier kommt's. Ich poste nur die relevanten Methoden vom Listener. Dieser hängt direkt an der JTextPane (
Code:
editChat
).
Das Vorgehen ist so, dass beim MouseOver der Hand-Cursor (
Code:
boolean handCursor
) gesetzt wird, und man sich zugleich das Text-Element (
Code:
linkElement
) in Attributen merkt, damit man beim
Code:
mouseClicked()
weniger Arbeit hat.
Bei mir ist's aber so, dass die URL direkt angezeigt wird, d.h. in
Code:
mouseClicked()
müsstest du noch via
Code:
getAttribute()
oder so die tatsächliche URL ermitteln.
Java:
    @Override
    public void mouseMoved( MouseEvent event )
    {
        if (event == null)
            return;
        if (event.isConsumed())
            return;
        if ( ! editChat.equals(event.getComponent()))
            return;
        
        // das Text-Element an der Mouse-Position ermitteln
        int     pos  = editChat.viewToModel( event.getPoint() );
        Element elem = ((StyledDocument) editChat.getDocument()).getCharacterElement(pos);
        if (elem != null)
        {
            AttributeSet set = elem.getAttributes();
            if (set != null)
            {
                // Ok ... ich erkenne einen Link daran, dass er unterstrichen ist ;)
                Object  attr   = set.getAttribute(StyleConstants.Underline);
                boolean isLink = (attr != null && attr.equals(Boolean.TRUE));
                
                if (isLink && ! handCursor)
                {
                    handCursor  = true;
                    linkElement = elem;
                    editChat.setCursor( Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) );
                } //if Hand-Cursor setzen
                else if ( ! isLink && handCursor)
                {
                    handCursor  = false;
                    linkElement = null;
                    editChat.setCursor( Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) );
                } //if normalen Cursor setzen
            } //if Attribute
        } //if Element
    } //void mouseMoved(MouseEvent)

    @Override
    public void mouseClicked( MouseEvent event )
    {
        if (event == null)
            return;
        if (event.isConsumed())
            return;
        if (linkElement == null)
            return;
        if ( ! SwingUtilities.isLeftMouseButton(event))
            return;
        if (event.getClickCount() > 1)
            return;
        if ( ! editChat.equals(event.getComponent()))
            return;
        
        try
        {
            String url = editChat.getDocument().getText(
                    linkElement.getStartOffset(),
                    linkElement.getEndOffset()-linkElement.getStartOffset());
            //hier müsstest du über die Textattribute von linkElement an die URL kommen
            this.callLink(url);
        } //try
        catch (BadLocationException BLexc)
        {}
    } //mouseClicked(MouseEvent)

Das
Code:
callLink()
macht einfach:
Code:
Desktop.getDesktop().browse( new java.net.URI(urlString) );
mit etwas Fehlerabfrage usw.
Was außerdem fehlt ist, dass einmal geklickte Links anders gefärbt werden (meistens lila), aber das kann man nach Bedarf auch noch einarbeiten.

...letztlich muss man aber feststellen, dass das ganze mit einer JEditorPane und einem HyperLinkListener wesentlich bequemer vonstatten ginge ;)
 

it07006

Mitglied
Hallo KrokoDiehl,

danke für die schnelle Antwort. Ich werde es heute noch ausprobieren und mein Ergebnis posten. Eine EditorPane ist fast immer die bessere Wahl, allerdings wurde sie für dieses Projekt verboten, da sie ja schon nativ HTML interpretieren kann.

Gruß
 

it07006

Mitglied
So, etwas spät ich weiß, aber das Studium war stressig. Also ich habe es probiert und es funktioniert wunderbar. Ein kleiner Makel ist noch, wenn man die Maus zwischen dem Klicken auf den Link nicht bewegt, dann passiert auch nicht, aber das finde ich nicht so schlimm.
Danke nochmal an KrokoDiehl.

Wer den Code haben möchte soll sich einfach melden.

Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JTextPane Text anklickbar machen bzw. Hyperlink erstellen? AWT, Swing, JavaFX & SWT 5
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
S Swing Style Attribute aus JTextPane kopieren AWT, Swing, JavaFX & SWT 1
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
TheJavaKid JTextPane: komplexe Formatierung (links) AWT, Swing, JavaFX & SWT 2
B Swing JTextPane - Einfärbungen auf "default" AWT, Swing, JavaFX & SWT 2
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
T Hintergrundbild in JTextPane fixieren AWT, Swing, JavaFX & SWT 2
M Swing JTextPane frisst Anführungszeichen AWT, Swing, JavaFX & SWT 2
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
R Swing Renderproblem bei HTML in einer JTextPane AWT, Swing, JavaFX & SWT 12
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
Tobse Swing [JTextPane] Farbliche Hervorhebung AWT, Swing, JavaFX & SWT 9
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JTextPane Tastatureingabe abfangen AWT, Swing, JavaFX & SWT 4
B Durchsichtiges JScroll und JTextPane AWT, Swing, JavaFX & SWT 4
xehpuk Swing JTextPane in JScrollPane wird nicht ordentlich neugezeichnet AWT, Swing, JavaFX & SWT 3
S Swing JTextPane append formatprobleme AWT, Swing, JavaFX & SWT 5
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
S JEditorPane oder JTextPane? AWT, Swing, JavaFX & SWT 2
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTextPane - bewegungsloses Hintergrundsbild (Duplikat) AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
P Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane) AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
K Swing JTextPane Formatierungen SyntaxHighlighting AWT, Swing, JavaFX & SWT 11
F Mit TAB JTextPane wechseln AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
S Buchstabenpositionen in JTextPane erhalten..? AWT, Swing, JavaFX & SWT 5
T Swing JTextArea, JTextPane, JEditorPane...Unterschied?! AWT, Swing, JavaFX & SWT 3
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
A JTextPane: Text hinzufügen AWT, Swing, JavaFX & SWT 9
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
E Swing JTextPane linewrap AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
M Formatierungsfehler JTextPane WARUM ?? AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
E JTextPane Bold Italic und Co AWT, Swing, JavaFX & SWT 6
M JTextPane Ende des Feldes AWT, Swing, JavaFX & SWT 4
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
P Probleme mit JTextpane AWT, Swing, JavaFX & SWT 7
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
bugmenot JTextPane String stimmt nicht mit übergebenem String überein AWT, Swing, JavaFX & SWT 9
C JTextPane <br oder <p> statt \n AWT, Swing, JavaFX & SWT 2
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
G JTextPane durchsichtig? AWT, Swing, JavaFX & SWT 6
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
S JTextPane: Probem mit AlignmentAction AWT, Swing, JavaFX & SWT 3
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
Steev JTextPane mit Textformatierung funktioniert nicht AWT, Swing, JavaFX & SWT 5
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
G insert & JTextPane AWT, Swing, JavaFX & SWT 4
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
A JScrollPane in JTextPane AWT, Swing, JavaFX & SWT 2
B Swing Logging: Ein/Ausblenden eines scrollenden JTextPane AWT, Swing, JavaFX & SWT 2
F Java JTextPane AWT, Swing, JavaFX & SWT 13
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
G Zeilenabstand bei HTML-Texten in JLabel/JTextPane AWT, Swing, JavaFX & SWT 7
O Swing Xml highlightning mit JTextPane und Regular expressions AWT, Swing, JavaFX & SWT 5
J JTextPane Alignment AWT, Swing, JavaFX & SWT 6
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5
B Ein großes JTextPane komplett drucken AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben