# Highlighter



## michi2 (13. Mai 2006)

Hallo,
ich habe meinen Editor soeben mit ner Highlightefunktion ausgestatet, jedoch wird jetzt die Hintergrund-farbe und nicht die Textfarbe geändert, wie kann ich das ändern?
Ich arbeite mit folgenden:

```
// Creates highlights around all occurrences of pattern in textComp
       final public void highlight(JTextComponent textComp, String pattern) {
           // First remove all old highlights
           //removeHighlights(textComp);
      
           try {
               Highlighter hilite = textComp.getHighlighter();
               Document doc = textComp.getDocument();
               String text = doc.getText(0, doc.getLength());
               int pos = 0;
       
               // Search for pattern
               while ((pos = text.indexOf(pattern, pos)) >= 0) {
                   // Create highlighter using private painter and apply around pattern
                   hilite.addHighlight(pos, pos+pattern.length(), myHighlightPainter);
                   pos += pattern.length();
               }
           } catch (BadLocationException e) {
           }
       }
       
       // Removes only our private highlights
       final public void removeHighlights(JTextComponent textComp) {
           Highlighter hilite = textComp.getHighlighter();
           Highlighter.Highlight[] hilites = hilite.getHighlights();
       
           for (int i=0; i<hilites.length; i++) {
               if (hilites[i].getPainter() instanceof MyHighlightPainter) {
                   hilite.removeHighlight(hilites[i]);
               }
           }
       }
       
       // A private subclass of the default highlight painter
       class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter {
           public MyHighlightPainter(Color color) {
               super(color);
           }
       }
```


----------



## Leroy42 (13. Mai 2006)

setForeground(Color)


----------



## michi2 (13. Mai 2006)

Häää???
setForeground(Color) ändert doch die Farbe des ganzen Textes, ich will aber nur das gehighligte einfärben!!!!
Oder wie meinst du das?


----------



## André Uhres (14. Mai 2006)

michi2 hat gesagt.:
			
		

> ..ich habe meinen Editor soeben mit ner Highlightefunktion ausgestatet,
> jedoch wird jetzt die Hintergrund-farbe und nicht die Textfarbe geändert, wie kann ich das ändern?..


Der Highlighter soll nicht die Textfarben verändern, sondern nur den Text markieren,
so wie man das von den bunten Textmarker Stiften her kennt.
Die eigentlichen Textfarben kannst du im JTextPane mit setCharacterAttributes ändern:
http://javaalmanac.com/egs/javax.swing.text/style_HiliteWords2.html

```
/*
 * ColoringText2.java
 */
//package text;
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class ColoringText2 extends JFrame {
    public ColoringText2() {
        super("Coloring text");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        textPane = new JTextPane();
        getContentPane().add(new JScrollPane(textPane), BorderLayout.CENTER);
        String txt = "Sample\n*  Override to apply syntax highlighting " +
                "after the document has been updated";
        textPane.setText(txt);
        StyledDocument doc = textPane.getStyledDocument();
        // Makes text red
        Style style = textPane.addStyle("Red", null);
        StyleConstants.setForeground(style, Color.red);
        // Makes text italicized
        style = textPane.addStyle("Italic", null);
        StyleConstants.setItalic(style, true);
        // Set text in the range [35, 12) red
        doc.setCharacterAttributes(35, 12, textPane.getStyle("Red"), true);
        // Italicize the entire paragraph containing the position 12
        doc.setParagraphAttributes(12, 1, textPane.getStyle("Italic"), true);
    }
    public static void main(String args[]) {new ColoringText2().setVisible(true);}
    private JTextPane textPane;
}
```
Wenn du in diesem Beispiel einen gelben Highlight machst mit _*highlight(textPane, "tax high");*_
dann wird der Text im Hintergrund gelb markiert, aber die eigentlichen Textfarben bleiben erhalten (schwarz und rot).


----------



## michi2 (14. Mai 2006)

Naja, ich will jedoch nen syntax-Highliter programmieren und dafür ist das "markieren" der Textstellen zimlich unbrauchbar!     :cry: 
Ich bin auf diese Highlight methode durch eueren Ratt was?hier gekommen....    
Ich benütze aller dings eine JTextArea, keine JTextPane, für die TA giebts nicht zufälig sowas? :cry: 
Das umsteigen von ner TA zur TP ist nicht soleicht, das fallen all die vielen vielen Methoden weg die ich oft gebrauche  :cry: , giebt es irgent eine anderes Textfeld, das so was wie "setCharacterAttributes" hatt, aber leichter zum umsteigen ist????


PS: Sorry für die vielen Smylies, musste jetzt einfach sein....  :cry:


----------



## Illuvatar (14. Mai 2006)

Also die TextArea kann eben kaum was und ist somit für einen Editor denkbar ungeeignet.
Es gibt übrigens auch noch die JEditorPane.


----------



## michi2 (14. Mai 2006)

Die haben aber folgende Methoden nicht:
append(String str)
getColumns()
getColumnWidth()
getLineCount()
getRows()
getLineEndOffset(int line)
getLineOfOffset(int offset)
getLineStartOffset(int line)
setFont(Font f)
setRows(int rows)
...
Giebt es ne Komponette die die unterstützt, aber trotzdem mehr als die JTA kann (syntaxhightlighting), zum Beispiel ein auf der JTP oder JEP basierende (oppensource) komponete die obiege Methoden zu verfügung stellt. Die ich in meinem Editor verwenden kann????
So was such ich schon länger!
Kann mir mal jemand erklären/nen link geben was die Unter schiede zwischen den TextKomponenten sind?
Wenn ihr wollt schaut euch meinen Editor doch mal an: www.schoenitzer.de


----------



## André Uhres (14. Mai 2006)

michi2 hat gesagt.:
			
		

> Naja, ich will jedoch nen syntax-Highliter programmieren und dafür ist das "markieren" der Textstellen zimlich unbrauchbar!     :cry:
> Ich bin auf diese Highlight methode durch eueren Ratt was?hier gekommen....
> Ich benütze aller dings eine JTextArea, keine JTextPane, für die TA giebts nicht zufälig sowas? :cry:
> Das umsteigen von ner TA zur TP ist nicht soleicht, das fallen all die vielen vielen Methoden weg die ich oft gebrauche  :cry: , giebt es irgent eine anderes Textfeld, das so was wie "setCharacterAttributes" hatt, aber leichter zum umsteigen ist????
> ...


Die Highlightvariante für JTextArea hatte ich nur gezeigt weil du unbedingt etwas für JTextArea wolltest.
Ich hab dir aber auch diesen Link gegeben:
http://www.discoverteenergy.com/files/SyntaxDocument.java
Das Umsteigen auf JEditorPane ist vielleicht nicht so problematisch wie du denkst.
Die paar Methoden die JTextArea unterstützt, kann man für JEditorPane wahrscheinlich auch schnell selbst basteln.


----------



## michi2 (14. Mai 2006)

> Das Umsteigen auf JEditorPane ist vielleicht nicht so problematisch wie du denkst.
> Die paar Methode die JTextArea unterstützt, kann man für JEditorPane wahrscheinlich auch schnell selbst basteln.


Glaubst du wirklich? wüßte jetzt auf anhieb nicht wie ichz.B  getRows(),  getLineCount(), getLineEndOffset(int line) und seine 2 Brüder schreiben soll,
das wird zimlich viel (uninteressante) Arbeit, drumm frag ich ob nicht schon jemand so was gemacht und nacher unter GPL oder so gestellt hat.
(Ja ich weiß ich bin faul und suche ständig nach fertigen Projekten für meine Progs.  )


----------



## André Uhres (14. Mai 2006)

michi2 hat gesagt.:
			
		

> ..das wird zimlich viel (uninteressante) Arbeit..


Das soll man nie sagen, denn in Java ist alles interessant. Hier ein paar Anhaltspunkte:

Für JEditorPane hast du das *DefaultStyledDocument* (siehe Link oben).
Das DefaultStyledDocument setzt sich zusammen aus *Element*s 
in hierarchischer Ordnung mit einem Root:

```
private DefaultStyledDocument doc;
	private Element rootElement;
```
Den Root bekommst du so:

```
rootElement = doc.getDefaultRootElement();
```
Alles Weitere ergibt sich daraus:

```
rootElement.getElementCount()             -> Anzahl der Zeilen
Element line = rootElement.getElement(i)  -> Zeile an Position i
line.getStartOffset()                     -> Position der Zeile im Dokument
line.getEndOffset()                       -> Position des Zeilenendes im Dokument
rootElement.getElementIndex( offset )     -> Position der Zeile die die Position offset enthält.
doc.getText(0, doc.getLength())           -> gesamter Inhalt des Dokuments als String
```


----------



## michi2 (14. Mai 2006)

Danke, werd mich mal einarbeiten....
Aber was ist der Unterschied zwischen JEditorPane und JTextPane?



> doc.getText(0, doc.getLength())           -> gesamter Inhalt des Dokuments als String


Geht doch auch per EP.getText()


----------



## André Uhres (14. Mai 2006)

michi2 hat gesagt.:
			
		

> Aber was ist der Unterschied zwischen JEditorPane und JTextPane?


http://java.sun.com/docs/books/tutorial/uiswing/components/editorpane.html



			
				michi2 hat gesagt.:
			
		

> doc.getText(0, doc.getLength())           -> gesamter Inhalt des Dokuments als String
> Geht doch auch per EP.getText()


Ja, so sollte es eigentlich auch gehen.
Ich hatte aber in einem anderen Forum schon einen Fall wo es nur über das Document ging.
Da man in unserem Fall das Document sowieso braucht, würde ich die Documentversion hier vorziehen.


----------



## michi2 (15. Mai 2006)

Da geht aber obiges Highliten auch, oder?


----------



## André Uhres (15. Mai 2006)

michi2 hat gesagt.:
			
		

> Da geht aber obiges Highliten auch, oder?


Ja das müsste für alle *JTextComponent*s funzen.


----------



## michi2 (21. Mai 2006)

Sorry, ich versteh das nicht...
Wiso geht folgendes nicht???

```
package test;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.text.*;


class MyEP extends JEditorPane
   {
   private DefaultStyledDocument doc;
   private Element rootElement;
   rootElement = doc.getDefaultRootElement();
   
   int getLineCount()
      {
      return rootElement.getElementCount();            // -> Anzahl der Zeilen
      }
   }
```


----------



## byte (21. Mai 2006)

Wenn das alles an Code ist, kanns ja nicht funktionieren. Denn doc wird nie erzeugt, deshalb wird doc.getDefaultRootElement() immer ne NullPointer schmeissen.

Gewöhn Dir bitte mal an, auch die Fehlermeldung zu posten anstatt einfach nur zu fragen "was geht hier nicht"!


----------



## michi2 (21. Mai 2006)

Sorry, er bringt aber keine Nullpointerex. sondren "<identifier> expected" und das versteh ich nicht. Mit was mus ich den DefaultStyledDocument initialisieren wen ich plain text will? Hab das wohl immernoch nicht ganz verstanden...


----------



## michi2 (21. Mai 2006)

Hä,
wenn ich

```
private Element rootElement;
   rootElement = doc.getDefaultRootElement();
```
zu

```
private Element rootElement = doc.getDefaultRootElement();
```
zusammen fasse geht es...
Aber was ist mit dem DefaultStyledDocument?


----------



## michi2 (21. Mai 2006)

Sorry Andre,
Ich hab's immer noch nicht verstanden, wie soll ich deine Code-Stücke einbauen, wollt das wie oben machen, aber das DefaultStyledDocument wird wohl nicht aktuallisiert wenn ich setText benütze.


----------



## michi2 (21. Mai 2006)

Hab mir jetzt http://www.discoverteenergy.com/files/SyntaxDocument.java noch mal in ruhe angeschaut, kapiere aber noch weniger!
Kann mir bitte jemand helfen:
Ich will eine JEditorPane mit Syntaxhighliting versehen
und ihm die Methoden der JTextArea beibringen.

Wie mach ich das?


----------



## Azrahel (22. Mai 2006)

Sag mal Andre wie lang progst du schon Java?

gibts da auch irgendwas was du noch nicht aus dem FF weisst?


----------

