Hyperlink mit JEditorPane

Status
Nicht offen für weitere Antworten.

vegeta

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

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

vegeta

Aktives Mitglied
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
 

vegeta

Aktives Mitglied
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
 

vegeta

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

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

vegeta

Aktives Mitglied
Code:
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
Code:
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

Top Contributor
Hi,

lasst den Parser in Ruhe. :wink:
Mit HyperlinkListener geht sowas ganz einfach.
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);
    }
  }
);
Gruß,
Michael
 

vegeta

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Aktives Mitglied
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

Code:
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

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

vegeta

Aktives Mitglied
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

Aktives Mitglied
bins noch mal font-size macht man das,

aber die geschichte mit Hover effekt funktioniert nicht oder bist

du anders informiert
 

vegeta

Aktives Mitglied
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

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

vegeta

Aktives Mitglied
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

Top Contributor
:D

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

Aktives Mitglied
Hallo,

also der code

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

Top Contributor
Versuchs doch mal so:

Code:
Element e = (Element ) event.getSource();


Glaub zwar nicht, dass es funzt....
 

vegeta

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

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

Aktives Mitglied
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

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

folgender code

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

Aktives Mitglied
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

Code:
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Hyperlink hervorheben mit Hilfe von der Klasse JEditorPane Allgemeine Java-Themen 7
GianaSisters Apache POI - Hyperlink erstellen Allgemeine Java-Themen 0
A Hyperlink von Java im Webbrowser öffnen Allgemeine Java-Themen 3
S JButton als Hyperlink ? Allgemeine Java-Themen 32
W Relative Pfadangabe in JEditorPane zur lokalen Datei Allgemeine Java-Themen 2
A Auswahl eines JEditorPane das Sich in einem JScrollPanel Befindet Allgemeine Java-Themen 2
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
C JEditorPane langsam großes HTML Allgemeine Java-Themen 8
T TextArea, JTextPane, JEditorPane Allgemeine Java-Themen 11
StrikeTom Swing JEditorPane automatischer Umbruch Allgemeine Java-Themen 4
W CSS in JEditorPane Allgemeine Java-Themen 32
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
S Swing mit JEditorPane per HTML auf Bilder in JAR zugreifen. Allgemeine Java-Themen 3
E JTextArea / JEditorPane + Text formatieren Allgemeine Java-Themen 3
T JavaScript aus HTML im JEditorPane ausführen? Allgemeine Java-Themen 5
X Ausgabe auf JEditorPane Allgemeine Java-Themen 5
Iron Monkey JEditorPane mit Refresh von Meta Allgemeine Java-Themen 7
S ImageTag in JEditorPane Allgemeine Java-Themen 2
R JTextPane (JEditorPane) ignoriert JScrollPane Allgemeine Java-Themen 5
U JEditorPane & copy'n'paste Allgemeine Java-Themen 34
O breite des inhalts eines jeditorpane Allgemeine Java-Themen 2
G JEditorPane Zeilenumbruch Allgemeine Java-Themen 1
G JEditorPane will nicht scrollen! Allgemeine Java-Themen 2
D Suchfunktion innerhalb Jeditorpane Allgemeine Java-Themen 6
G JEditorPane: angezeigter Text Allgemeine Java-Themen 21
D Jeditorpane + einlesen ausserhalb des Jar Allgemeine Java-Themen 4
T JApplet - JEditorPane gegen JPanel tauschen Allgemeine Java-Themen 2
T JEditorPane oder JTextPane Applets und Flash anzeigen Allgemeine Java-Themen 7
T JEditorPane aktualisieren Allgemeine Java-Themen 14
S JEditorPane / JScrollPane und nach unten scrollen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben