Highlighter

Status
Nicht offen für weitere Antworten.

michi2

Bekanntes Mitglied
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:
Code:
       // 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);
           }
       }
 

michi2

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

Top Contributor
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
Code:
/*
 * 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

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

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

michi2

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

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


PS: Sorry für die vielen Smylies, musste jetzt einfach sein.... :cry:
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

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

Top Contributor
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 Elements
in hierarchischer Ordnung mit einem Root:
Code:
	private DefaultStyledDocument doc;
	private Element rootElement;
Den Root bekommst du so:
Code:
		rootElement = doc.getDefaultRootElement();
Alles Weitere ergibt sich daraus:
Code:
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
 

André Uhres

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

Bekanntes Mitglied
Sorry, ich versteh das nicht...
Wiso geht folgendes nicht???
Code:
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

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

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

Bekanntes Mitglied
Hä,
wenn ich
Code:
   private Element rootElement;
   rootElement = doc.getDefaultRootElement();
zu
Code:
   private Element rootElement = doc.getDefaultRootElement();
zusammen fasse geht es...
Aber was ist mit dem DefaultStyledDocument?
 

michi2

Bekanntes Mitglied
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.
 
A

Azrahel

Gast
Sag mal Andre wie lang progst du schon Java?

gibts da auch irgendwas was du noch nicht aus dem FF weisst?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben