Synax-highlighting

Status
Nicht offen für weitere Antworten.

michi2

Bekanntes Mitglied
Hi,
ich hab Editor der bis jetzt mit ner JTextArea arbeitet. (Java 1.4!!!)
Ich will ihm um Synax-highlighting erweitern, die JTextArea erlaubt aber nur den ganzen Text
mit einer Farbe zu färben, JTextPane erlaugt dies, hat jedoch die vielen nützlichen Methoden der JTextArea (getLineEndOffset(int line); append(String str); getLineCount() ....) nicht, auserdem scheint es mir viel arbeit Synax-highlighting komplet selbst zu programmieren,
giebt es ein unter OpenSource (GPL oder ählich) stehendes Projekt das ich benutzen kann???


PS: Hab jetzt endlich nen Internetzugang :D :D :D :D , werdet also wohl oder übel öffter von mir hören.... :wink:
 

michi2

Bekanntes Mitglied
Danke erstmahls, das hab ich noch nicht gefunden!
Giebt es vileicht auch ne möglichkeit (java) Quelltext automatisch vormatirn zu lassen?
 

André Uhres

Top Contributor
michi2 hat gesagt.:
..Giebt es vileicht auch ne möglichkeit (java) Quelltext automatisch vormatirn zu lassen?
Jede IDE kann das.
Ich hab mal versucht selbst so was zu basteln. Ist aber sehr simpel und ohne Gewähr:
Code:
   private void reformat()throws BadLocationException{
        String text = textarea.getText();
        int tabs = 0;
        int size = textarea.getLineCount();
        int lineStart = 0;
        int lineEnd = 0;
        String textLine = "";
        String output = "";
        for( int line=0; line<size; line++ ){
            lineStart = textarea.getLineStartOffset(line);
            lineEnd = textarea.getLineEndOffset(line);
            if( (lineEnd-lineStart)>1 ){
                textLine = text.substring(lineStart, lineEnd).trim();
                if( textLine.indexOf( '}' ) >- 1  &&  tabs > 0 ){
                    tabs = tabs - 1;
                }
                output = output + tabsString(tabs) + textLine +"\n";
                if( textLine.indexOf( '{' ) > -1 ){
                    tabs = tabs + 1;
                }
            }
        }
        textarea.setTabSize(3);
        textarea.setText(output);
        validate();
    }
    private String tabsString(int tabs){
        String tabsStr = "";
        for( int i=0; i<tabs; i++ ){
            tabsStr = tabsStr + "    ";
        }
        return tabsStr;
    }
 

Illuvatar

Top Contributor
Zu deinem Code, André: :meld:

1. Sollte man statt String += blupp eher einen StringBuilder verwenden
2. Machst du für einen Tab
Code:
"    "
ich denke, "\t" wäre sinnvoller.

Nunja, ich vermute mal, da war für dich nichts neues dabei :D Aber es war mir so augefallen.
 

michi2

Bekanntes Mitglied
R

Roar

Gast
???:L lies dir die seite doch durch. das ding kann doch noch nichtmal java code highlighten und ich dachte das ist das was du suchst? so wie das programm aussieht benutzt das sinnigerweise auch JEditorPane oder JTextPane.
warum schreibst du dir den code denn nich selber? :gaen:
 

michi2

Bekanntes Mitglied
Bei dem Link durch den ich die Seite gefunden habe stand ausdrücklich: "Editor-Komponente"; drum hab ich mich gewundert...
Du meinst so wie in http://javaalmanac.com/egs/javax.swing.text/style_HiliteWords.html mit ner Schleife und nem Array:
Code:
String[] pattern = {"public", "private", "static", "void", ...............,};
Das wird aber viel mühsamme Tipparbeit und schlieslich sollen die auch noch unterschiedliche Farben bekommen...
 

michi2

Bekanntes Mitglied
Sorry, hab den Satz nicht zu Ende gelesen...
Ich bin wohl heute ganz depert..... :bahnhof: :autsch:
(Hab ne Scheiß laune :x )
 

André Uhres

Top Contributor
michi2 hat gesagt.:
..Was ich wirklich fragen wolte ist ob es eine Möglichkeit giebt (java) Quelltext automatisch zu Highligten, anstatt wie bei http://javaalmanac.com/egs/javax.swing.text/style_HiliteWords.html jedes Stichwort einzeln selbst zu Highliten!
Hab ich eigentlich auch schon beantwortet.
Mein letzter Beitrag gibt dir den Link zu einem interessanten sun forum Thread
mit u.a. diesem fertigen Beispiel:
http://www.discoverteenergy.com/files/SyntaxDocument.java
 

André Uhres

Top Contributor
Illuvatar hat gesagt.:
Zu deinem Code, André: :meld:

1. Sollte man statt String += blupp eher einen StringBuilder verwenden
2. Machst du für einen Tab
Code:
"    "
ich denke, "\t" wäre sinnvoller.

Nunja, ich vermute mal, da war für dich nichts neues dabei :D Aber es war mir so augefallen.
Ja das war mir auch aufgefallen als ich es posten sollte, ist ein sehr alter Codeschnipsel von mir.
Heute würde ich das natürlich nicht mehr so machen, hatte allerdings keine Lust dazu um das noch anzupassen...
wer es braucht, kann es ja selbst machen, ist ne gute Übung :D
 

michi2

Bekanntes Mitglied
Ok, habs jetzt mahl selbst auf Basis von http://javaalmanac.com/egs/javax.swing.text/style_HiliteWords.html geschriegen, leider hab ich zur Zeit keine laufende SDK zur Hand, könntet ihr mir also sagen was ihr von folgendem Ansatz findet:
Code:
    JTextArea textComp = new JTextArea();

    // An instance of the private subclass of the default highlight painter
    Highlighter.HighlightPainter myHighlightPainter;

    //Einzeilige Komentare 
    myHighlightPainter = new MyHighlightPainter(Color.blue);
        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, "//")) >= 0)
                 {
                // Create highlighter using private painter and apply around pattern
                hilite.addHighlight(pos, textComp.getLineEndOffset(textComp.getLineOfOffset(pos) , myHighlightPainter);
                pos = textComp.getLineEndOffset(textComp.getLineOfOffset(pos);
                }
        } catch (BadLocationException e){}

    //headword Gruppe 1 highlighten
    String[] headword = {"public", "private","static","final","try","catch","final","for","while","if","else"};
    myHighlightPainter = new MyHighlightPainter(Color.red);
   for(int i=0; i<headwords.lenth; i++)
      {
      // Highlight the occurrences of the word headword[i]
      highlight(textComp, headword[i]);
      }
    
    //headword Gruppe 2 highlighten
    headword = {"int","double","byte","float","byte","short","long","char","boolean","String"};
    myHighlightPainter = new MyHighlightPainter(Color.green);
   for(int i=0; i<headwords.lenth; i++)
      {
      // Highlight the occurrences of the word headword[i]
      highlight(textComp, headword[i]);
      }

    // Creates highlights around all occurrences of pattern in textComp
    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
    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);
        }
    }
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben