uepselon: SyntaxHighlighting in JTextPane

Hallo,

ich versuche gerade eine Methode zu schreiben die vorhandenen Text in einem JTextPane je nach Syntax farblich hervorhebt.

Mein Ansatz hierzu:

public void syntaxHigh(boolean flag)
            {
            if (flag)
               {
               String all_text = mainText[currIndex].getText();

int pos = -1;

MutableAttributeSet attr1 = new SimpleAttributeSet();
               MutableAttributeSet attr2 = new SimpleAttributeSet();

StyleConstants.setForeground(attr1, Color.red);
               StyleConstants.setForeground(attr2, Color.blue);
               StyledDocument doc = mainText[currIndex].getStyledDocument();

while((pos = all_text.indexOf("new", pos + 1)) > -1)
                    {
                    doc.setCharacterAttributes(pos, 3, attr2, false);
                    }

}
            }

Das JTextPane ist mainText[currIndex], ansich funktioniert diese Funktion auch. Nur ist sie viel zu langsam. Bei einem Text mit ca. 800 Zeilen wird die Wartezeit einfach zu hoch. Zumal die Funktion bis jetzt auch nur das Schlüsselwort "new" frablich hervorhebt. Bei mehreren Wörtern wirds noch viel langsamer.

Hat jemand einen Tipp wie ich das optimieren kann?

Gruß,
ueps

  1. Hi ueps,

    Das JTextPane ist mainText[currIndex], ansich funktioniert diese Funktion auch. Nur ist sie viel zu langsam. Bei einem Text mit ca. 800 Zeilen wird die Wartezeit einfach zu hoch. Zumal die Funktion bis jetzt auch nur das Schlüsselwort "new" frablich hervorhebt. Bei mehreren Wörtern wirds noch viel langsamer.

    Hat jemand einen Tipp wie ich das optimieren kann?

    Ein genereller Ansatz besteht darin, dass Du _nur_ die Textanteile 'syntax-highlightest', die für den Benutzer im Editor sichtbar sind. Sinnvollerweise werden die Formatierinformationen auch nicht dem eigentlichen 'Dokument' hinzugefügt, sondern die JTextPane erhält immer nur den Teil des Textes samt Formatierinfo, der gerade sichtbar ist (sein müsste). Eine solche Implementierung ist aber nicht mehr trivial.
    Eine Suche bei Sun erbrachte folgenden Link, der Dir vielleicht weiterhilft:  http://java.sun.com/products/jfc/tsc/articles/text/editor_kit/index.html.

    Viele Grüße,
    Martin Jung

    1. Hi Martin,

      Ein genereller Ansatz besteht darin, dass Du _nur_ die Textanteile 'syntax-highlightest', die für den Benutzer im Editor sichtbar sind. Sinnvollerweise werden die Formatierinformationen auch nicht dem eigentlichen 'Dokument' hinzugefügt, sondern die JTextPane erhält immer nur den Teil des Textes samt Formatierinfo, der gerade sichtbar ist (sein müsste). Eine solche Implementierung ist aber nicht mehr trivial.

      In der Tat, bis jetzt liegt alles im TextPane, das auch aus gutem Grund, da bis zu 100 TextPanes auf einem TabbedPane liegen können, und ich daher die einzelnen Zuständer der TextPanes nicht extra sichern muss.

      Eine Suche bei Sun erbrachte folgenden Link, der Dir vielleicht weiterhilft:  http://java.sun.com/products/jfc/tsc/articles/text/editor_kit/index.html.

      Danke, aber den hab ich auch schon gelesen. Das ganze ist recht komplex und ein versuch die Code-Beispiele zu kompilieren brachte keinen Erfolg,da auf wilde Packages wie examples.*** oder sonstige nicht Vorhandene Sachen zugegriffen wird.

      Gruß,
      ueps

      1. Hi ueps,

        In der Tat, bis jetzt liegt alles im TextPane, das auch aus gutem Grund, da bis zu 100 TextPanes auf einem TabbedPane liegen können, und ich daher die einzelnen Zuständer der TextPanes nicht extra sichern muss.

        Du müsstest Dir doch eigentlich 'nur' die Cursorpositionen merken.

        Danke, aber den hab ich auch schon gelesen. Das ganze ist recht komplex

        Das, was Du erreichen willst, ist in der Tat komplex.

        und ein versuch die Code-Beispiele zu kompilieren brachte keinen Erfolg,da auf wilde Packages wie examples.*** oder sonstige nicht Vorhandene Sachen zugegriffen wird.

        Das müsste Dir als Java-Programmierer einleuchten ;-)
        Ich habe den Artikel auch nur kurz überflogen und denke, dass er vor allem Strategiealternativen präsentieren möchte und weniger gebrauchsfertige Lösungen für die Praxis.
        Nochmal: Wenn Du ausgefuchstes Syntaxhighlighting willst _und_ gute Performance, wirst Du um einen entsprechenden Ansatz und dem verbundenen Aufwand nicht herumkommen (was machst Du erst bei richtig großen Klassen?).

        Viele Grüße,
        Martin Jung

        1. Hallo,

          Du müsstest Dir doch eigentlich 'nur' die Cursorpositionen merken.

          Das reicht leider nicht, den Cursor kann ich nur "sichern" wenn er auch im TextPane drin ist, wird nur gescrollt ohne den Cursor zu bewegen muss ich auch die ScrollPos sichern. Dann noch die Markierungen für Zeilennummern etc. Das ist sehr umständlich.

          Danke, aber den hab ich auch schon gelesen. Das ganze ist recht komplex
          Das, was Du erreichen willst, ist in der Tat komplex.

          Ja, das merk ich. Obwohl eingelich SyntaxHighlighting recht einfach ausschaut.

          Das müsste Dir als Java-Programmierer einleuchten ;-)

          Nicht wirklich. Wenn man in der zip Datei alle Sourcen drin hat, kann man doch erwatren das bei javac xxx.java alles klappt und keine Fehler kommen.

          Nochmal: Wenn Du ausgefuchstes Syntaxhighlighting willst _und_ gute Performance, wirst Du um einen entsprechenden Ansatz und dem verbundenen Aufwand nicht herumkommen (was machst Du erst bei richtig großen Klassen?).

          Hm, dann hab ich wohl noch viel Arbeit vor mir.

          Gruß,
          ueps