# Hyperlink mit JEditorPane



## vegeta (16. Mrz 2005)

Hallo,

wie kann ich die Farbe eines Links ändern wenn man über ihn fährt?

ich benutze JEditorPane, das wiederum in ein JScrollPane liegt.

Das ist nicht so einfach 

vielleicht hat jmd auch ein gutes tutorial oder ein Link

hoffe mir kann jmd. helfen


----------



## meez (16. Mrz 2005)

Wie schon mal gesagt, dass machst du mit HTML..Sobald du den Content als HTML setzt kannst du den TextStyle nicht mehr (oder nur sehr mühsam)  beeinflussen, da der HTML-Parser das geschehen übernimmt...
Dieser HTML Parser ist aber ziemlich beschränkt, deshalb lass solche Spiele lieber sein, und implementiere entweder den Parser selbst (viel Spass die nächsten 12 Jahre) oder mach ein "richtiges" GUI....


----------



## vegeta (16. Mrz 2005)

hi,

also ist es so schwer den Inhalt eines Html files was ich mit SetText(string) setze nachträglich umzubauen. ich muss doch nur den inhalt finden und ersetzen. kann man nicht nach links suchen und wenn man den gefunden hat nochmal ein <font> tag einbauen und bei bedarf wieder herausnehmen

mensch mensch ich hab leider nicht 12 Jahre


----------



## meez (16. Mrz 2005)

Klar kannst du..Ist aber genau das, was ich mit mühsam, bzw. unperfomant meine...


----------



## vegeta (16. Mrz 2005)

ich entscheide mich für den mühsamen weg

Jetzt zu der frage wie. 

Naja du hast ja mein anderes Problem gesehen mit dem 

autmatischen Scrollen zum ende. würde ich irgendwie die 

Position des Scrollbalken also der sicht mir merken können dann 

brauch ich das nicht mehr mit dem parsen


----------



## Wildcard (16. Mrz 2005)

vegeta hat gesagt.:
			
		

> Position des Scrollbalken also der sicht mir merken können dann
> 
> brauch ich das nicht mehr mit dem parsen


Warum merkst du dir nicht die Textposition und setzt das Carret entsprechend?


----------



## vegeta (16. Mrz 2005)

to Wildcard: also ich hab diesen Ansatz auch schon probiert aber das hat net geklappt wenn du den quellcode brauchst schau dir meine anderen themen an sind nicht viele

bis dann


----------



## Stefan1200 (17. Mrz 2005)

Den Hover Effekt gibt es doch nur in CSS. Kann der HTML 3.2 fähige Java HTML Parser überhaupt CSS?

Zum Nachlesen wie man was in HTML macht, empfehle ich SelftHTML:
http://www.selfhtml.org


----------



## vegeta (17. Mrz 2005)

hallo,

der JEditorPane unsterstützt nur eingeschränkt CSS, und darunter fällt der Hover effekt. 
Schade hätte die sache viel einfacher gemacht

danke


----------



## meez (17. Mrz 2005)

vegeta hat gesagt.:
			
		

> der JEditorPane unsterstützt nur eingeschränkt CSS, und darunter fällt der Hover effekt.



Der HTMLParser ...der Editor ist nur der View...

Was dein Problem betrifft...Du kannst den Link schon suchen, wenn über ihn gefahren wird (HyperLinkEvent.ENTERED), im ein neues Attribut zuweisen, und ihn dann wieder dem Parser übergeben...

Das Problem dabei ist, dass dann einfach bei jedem mal, wenn du über einen Link fährst, die gesamte Seite neu geparst und gerendert werden muss...Dies ist nicht sehr performant, geschweige den sehr Benutzerfreundlich, da das GUI zu 90 % der Zeit gesperrt ist...


----------



## vegeta (17. Mrz 2005)

hi meez,

wie weist man den parser das neue Attribut zu? einen Link finden bekomme ich hin aber dann ihn zu veränder nicht mehr.

ich arbeite gearade an einem neuen Ansatz und zwar lass ich mir das Htmldocument ausgeben und arbeite darin. aber wenn ich etwas hineinsetze ist es kein Html mehr sondern nur text.
ich benutze insertString(...)


----------



## meez (17. Mrz 2005)

Das meine ich damit...Du musst ein neues HTML-Dokument erstellen, und es wieder von neuem Parsen...


----------



## vegeta (18. Mrz 2005)

```
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
tagCount++;
if (t==HTML.Tag.A)
{
	linkCount++;
	ss.append(a.toString().substring(0,4));
	this.pos=pos;
}
}
```

die Methode ist in HTMLEditorKit.ParserCallback zu finden

und der wiederrum wird von 

```
ParserDelegator parser = new ParserDelegator();
parser.parse(br,tagCounter, false);
```

gestartet.

Also den Link würde ich finden, das href und sowie der text aber
wie soll ich dann den kompletten link herausnehemen  und einen neuen hinein legegen?


----------



## semi (18. Mrz 2005)

Hi,

lasst den Parser in Ruhe. :wink:
Mit HyperlinkListener geht sowas ganz einfach.
	
	
	
	





```
editorPane.addHyperlinkListener(
  new HyperlinkListener() {
    private MutableAttributeSet mouseEnteredAttributes = null;
    private MutableAttributeSet mouseExitedAttributes  = null;
    
    public void hyperlinkUpdate(HyperlinkEvent event) {
      Element e = event.getSourceElement();
      DefaultStyledDocument doc = (DefaultStyledDocument)e.getDocument();

      if(mouseEnteredAttributes == null) {
        mouseEnteredAttributes = new SimpleAttributeSet();
        StyleConstants.setForeground(mouseEnteredAttributes, Color.red);
        mouseExitedAttributes = new SimpleAttributeSet();
        StyleConstants.setForeground(mouseExitedAttributes, Color.blue);
      }
      
      if(event.getEventType() == HyperlinkEvent.EventType.ENTERED)
        doc.setCharacterAttributes(e.getStartOffset(), e.getEndOffset()-e.getStartOffset(), mouseEnteredAttributes, false);
      else if(event.getEventType() == HyperlinkEvent.EventType.EXITED)
        doc.setCharacterAttributes(e.getStartOffset(), e.getEndOffset()-e.getStartOffset(), mouseExitedAttributes, false);
    }
  }
);
```
Gruß,
Michael


----------



## vegeta (18. Mrz 2005)

hey danke das geht so wie du geschrieben hast, und ich hab mir schon überlegungen gemacht. Aber Michael du hast dir schön lange Zeit gelassen mit deiner Antwort 

Was hast du in dem Bereich gemacht?


----------



## semi (18. Mrz 2005)

vegeta hat gesagt.:
			
		

> Aber Michael du hast dir schön lange Zeit gelassen mit deiner Antwort


Ich wollte Dich noch etwas zappeln lassen. Wer weiß vielleicht käme dabei die Weltformel heraus. :bae:


			
				vegeta hat gesagt.:
			
		

> Was hast du in dem Bereich gemacht?


Wie meinst Du es? Mit Text-API?
Ich habe mich mal längere Zeit damit beschäftigt als ich eine spezielle Darstellung von
diversen Objekten gebraucht habe. Auch etwas rund um Syntaxhighlighting etc.
Ist aber schon 'ne Weile her.

Zieh Dir das hier mal rein
Using the Swing Text Package
Customizing a Text Editor
Concurrency In Swing Text

Gruß,
Michael


----------



## vegeta (18. Mrz 2005)

yo also ich weis schon mal was ich am wochende mache.

noch etwas standard mäßig werden links blau angzeigt. gibt es eine möglich keit dies zu änderen?

ich hab es mit dem Font Tag versucht, aber hierdurch funktioniert das Highlighting nicht mehr. Aber die Links werden schwarz angzeigt.

Also ich wollt vorhin nur mal wissen was du schon alles gemacht hast mit den HTML klassen vielleicht gibt es ja etwas zum betrachten


----------



## vegeta (18. Mrz 2005)

Vielleicht noch ein paar Infos

zum anzeigen benutze ich die Methode setText()

benutze ich insertString() hab ich das Problem das wenn mehrere 

links untereinander angezeigt werden müssen ich das mit ein "\n" 

erzwingen werden aber der Abstand zwischen Den Links ist zu 

gross hierdurch

oder muss ich doch parsen


----------



## semi (18. Mrz 2005)

vegeta hat gesagt.:
			
		

> yo also ich weis schon mal was ich am wochende mache.


Barbyque? :wink: (oder wie auch immer man es schreibt)
Am Wochenende solltest Du 'Gedankenfestiger' in Form von Bier zu sich nehmen.



			
				vegeta hat gesagt.:
			
		

> noch etwas standard mäßig werden links blau angzeigt. gibt es eine möglich keit dies zu änderen?
> 
> ich hab es mit dem Font Tag versucht, aber hierdurch funktioniert das Highlighting nicht mehr. Aber die Links werden schwarz angzeigt.


Wenn im Dokument nicht anders angegeben, werden die Default-Styles aus rt.jar verwendet (siehe rt.jar unter \javax\swing\text\html\default.css). Du kannst eigene Stylesheets verwenden. Siehe HTMLEditorKit.setStyleSheet(StyleSheet s) bzw. HTMLEditorKit.getStyleSheet()
Wenn Du selbst den Inhalt erstellst, kannst Du auch direkt in HTML mit CSS die Linkfarben bestimmen.



			
				vegeta hat gesagt.:
			
		

> Also ich wollt vorhin nur mal wissen was du schon alles gemacht hast mit den HTML klassen vielleicht gibt es ja etwas zum betrachten


 Zeig' ich nich' :bae: War auch nix Spektakuläres.

Ein Blick in die Sourcecodes von SUN lohnt sich oft, um zu sehen, wie manche Sachen implementiert sind.
Man kann dabei viel lernen oder auch fluchen (besonders bei Sachen, die Package-Protected sind).


----------



## vegeta (18. Mrz 2005)

ja Bier Cola und Pizza.
Also ich hab das mal probiert mit den Stylesheet aber ich glaub gelesen zu haben das Links nicht unterstützt werden. 
und das mit direkt klappt auch nicht ich habe mal folgendes versucht hat aber nicht geklappt

<body link="#FF0000">

und die geschichte mit 

<styles>
a:link {...}
</styles>

war erfolglos


----------



## vegeta (18. Mrz 2005)

Es muss doch möglich sein am Anfang dem Editor zu sagen wie er die Links darstellen soll, wie beispielsweise die größe, farbe und Schriftart anzugeben. Eigentlich soll dies mit stylesheets gehen aber irgendwie wird dies nicht komplett unterstützt
ich hab jetzt einen weg dies zu machen, aber wenn ich nur die größe der links ändern möchte weis ich nicht wie man dies hinbekommt


```
DefaultStyledDocument doc = (DefaultStyledDocument)this.getDocument(); 
		    SimpleAttributeSet color = new SimpleAttributeSet(); 
		    StyleConstants.setForeground(color, Color.black); 
		    doc.setCharacterAttributes(0,doc.getLength(),color,false);
```

was mir nicht gefällt das ich das nur nach laden eines HTML  benutzen kann


----------



## semi (18. Mrz 2005)

Doch, mit CSS geht es
<a href="..." style="text-decoration:none; color:#FF0000;">
oder
a {color: #FF0000; text-decoration: underline} global


----------



## vegeta (18. Mrz 2005)

ok ich hab nochmal nach geschaut die sachen mit den hover 

effekt hat nicht funktioniert. so sieht die welt schon wieder ganz 

anderes aus. Funkitioniert. und gibt es auch sowas wie size und 

schriftart


----------



## vegeta (18. Mrz 2005)

bins noch mal font-size macht man das,

aber die geschichte mit Hover effekt funktioniert nicht oder bist 

du anders informiert


----------



## semi (18. Mrz 2005)

Es wird nur das unterstützt, was in CSS.java steht.
Siehe: http://java.sun.com/j2se/1.3/docs/api/javax/swing/text/html/CSS.html
Leider ist die HTML Unterstützung in Swing ein Witz. Wird kaum weiterentwickelt.


----------



## vegeta (18. Mrz 2005)

also ich habe gelesen das Sun nichts hierfür macht, aber es gibt irgendwie ein Browser oder so ne api die jedoch Geldkostet und auch Hover effekte und andere CSS Stylesheets unterstützt


----------



## semi (18. Mrz 2005)

Was hast Du eigentlich damit vor? Willst Du einen Webbrowser schreiben
oder geht es Dir um eine schicke Benutzeroberfläche mit HTML?


----------



## vegeta (18. Mrz 2005)

Einen Browser habe ich nicht vor zu programmieren.  Die zweite Punkt kommt schon eher hin, ich probiere aus wie gut sich HTML als GUI schnittstelle eigent. Ich würd gern ein Mensch Ärgerdich nicht spiel programmieren was über das Netzwerk spielbar ist.
wenn ich wieder viel zeit hab beginne ich damit.


----------



## meez (19. Mrz 2005)

Herzlichen Glückwunsch .... Du hast es also doch noch geschaft...
Ich hoffte eigentlich, dass das nicht "rauskommt", dass man auch direkt in der Editorpane "rumpfuschen" kann....
Jetzt hast du das, was eben kein anständiges Program haben sollte...verschiedene Orte, wo Style Informationen definiert werden...u.a. sogar harcoded....

Hier noch ein weiteres Beispiel, falls du noch anderes hervorheben willst:
http://www.java-forum.org/de/viewtopic.php?t=9448


----------



## vegeta (21. Mrz 2005)

danke schaue mir den Link an


----------



## vegeta (29. Mrz 2005)

Hallo,

also der code 


```
editorPane.addHyperlinkListener( 
  new HyperlinkListener() { 
    private MutableAttributeSet mouseEnteredAttributes = null; 
    private MutableAttributeSet mouseExitedAttributes  = null; 
    
    public void hyperlinkUpdate(HyperlinkEvent event) { 
      Element e = event.getSourceElement(); 
      DefaultStyledDocument doc = (DefaultStyledDocument)e.getDocument(); 

      if(mouseEnteredAttributes == null) { 
        mouseEnteredAttributes = new SimpleAttributeSet(); 
        StyleConstants.setForeground(mouseEnteredAttributes, Color.red); 
        mouseExitedAttributes = new SimpleAttributeSet(); 
        StyleConstants.setForeground(mouseExitedAttributes, Color.blue); 
      } 
      
      if(event.getEventType() == HyperlinkEvent.EventType.ENTERED) 
        doc.setCharacterAttributes(e.getStartOffset(), e.getEndOffset()-e.getStartOffset(), mouseEnteredAttributes, false); 
      else if(event.getEventType() == HyperlinkEvent.EventType.EXITED) 
        doc.setCharacterAttributes(e.getStartOffset(), e.getEndOffset()-e.getStartOffset(), mouseExitedAttributes, false); 
    } 
  } 
);
```

funktioniert unter java 1.4
wie kann man das ganze anpassen damit das in der 1.3 lauffähig ist?

Danke für eure hilfe


----------



## meez (29. Mrz 2005)

Welche Klasse oder Methode findet er den nicht?


----------



## vegeta (29. Mrz 2005)

cool bist online, zeile 8

getSourceElement(); 

in der docu steht ab 1.4 steht es zur verfügung


----------



## vegeta (29. Mrz 2005)

ich suche gerade eine Möglickeit wie man auf andere wege an das Element kommt


----------



## meez (29. Mrz 2005)

Versuchs doch mal so:


```
Element e = (Element ) event.getSource();
```


_Glaub zwar nicht, dass es funzt...._


----------



## vegeta (29. Mrz 2005)

hat net geklappt ich ersparre dir die endlos erscheinende Fehlermeldung


----------



## meez (29. Mrz 2005)

Versuchs noch so:


```
Element e = ((HTMLFrameHyperlinkEvent) event).getSourceElement();
```


Quelle: http://www.skywayradio.com/tech/j2sdk141/swing/SwingChanges.html


----------



## vegeta (29. Mrz 2005)

ich werde das mal ausprobieren habe auch ein wenig recherchiert und einen neuen ansatz versucht hier der code


```
MutableAttributeSet mouseEnteredAttributes = null; 
    MutableAttributeSet mouseExitedAttributes  = null; 
    
    JTextPane editor = (JTextPane) e.getSource();
    System.out.println(editor.getText());
    HTMLEditorKit kit = (HTMLEditorKit)editor.getEditorKit();
    int x=e.getX();
    int y=e.getY();
    Point pt = new Point(e.getX(), e.getY());
   
    int pos = editor.getUI().viewToModel(editor, pt);
    Document doc2 = editor.getDocument();
    HTMLDocument hdoc = (HTMLDocument) doc2;
    Element el = hdoc.getCharacterElement(pos);
    DefaultStyledDocument doc = (DefaultStyledDocument)editor.getDocument(); 

    if(mouseEnteredAttributes == null) { 
      mouseEnteredAttributes = new SimpleAttributeSet(); 
      StyleConstants.setForeground(mouseEnteredAttributes, Color.red); 
      mouseExitedAttributes = new SimpleAttributeSet(); 
      StyleConstants.setForeground(mouseExitedAttributes, Color.black); 
    } 
    
    doc.setCharacterAttributes(el.getStartOffset(), el.getEndOffset()-el.getStartOffset(), mouseEnteredAttributes, false);
```


----------



## vegeta (29. Mrz 2005)

hat nicht geklappt.

der code von eben gerade funktioniert nur wenn man sich von 

links einem link nähert. komisch wenn man von recht oben oder 

unten es versucht klappt es ncith. vielleicht liegt es an der 

zeile 25 er versucht zu markieren aber weis nicht so wirlich wo


----------



## vegeta (29. Mrz 2005)

hallo hab eine möglich lösung gefunden, jedoch gibt es das berühmte aber:

folgender code


```
JEditorPane editor = (JEditorPane) e.getSource();
         HTMLDocument hdoc = (HTMLDocument) editor.getDocument();
         Element el=hdoc.getElement(e.getDescription());
      
         DefaultStyledDocument doc = (DefaultStyledDocument)editor.getDocument(); 
         doc.setCharacterAttributes(el.getStartOffset(), el.getEndOffset()-el.getStartOffset(), mouseEnteredAttributes, false);
```

das ganze muss unter java 1.3 laufen
Bei diese code funktioniert das highlighting ab und zu

ich weißt nicht warum

brauch rat, danke


----------



## vegeta (30. Mrz 2005)

hallo, ich komm nicht weiter.

ich versuche das oben geschilderte projekt zu umgehen.

gibt es die möglichkeit den Style auszulesen un neu zu setzen.

weil die Funktion 


```
doc.setCharacterAttributes(el.getStartOffset(), el.getEndOffset()-el.getStartOffset(), mouseEnteredAttributes, false);
```

mit true als letztes argument anstatt false ändert mir unter 1.3 

die farbe aber stürtz beim zweiten aufruf ab.

bis dann


----------

