Java SWT StyledText SQL-Syntax-Highligthing

Christopher25

Bekanntes Mitglied
Hallo.

Ich möchte gerne in SWT eine für die SQL-Syntax StyledText Komponente Entwerfen.
Also die Begriffe wie "SELECT", "AS", "FROM" usw. Sollen Dunkel Lila und die Kommentare mit
"/*" und "*/" sollen Dunkel Grün angezeigt werden.

Ich habe folgendes dazu im Internet gefunden:
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Demonstratesmultilinecomments.htm

Ich habe das etwas anders umgesetzt aber mit dem selben Prinzip:
Java:
// Hier die Implementierung in der oberklasse, dieser Kommentar steht nicht im Quellcode
// sondern wurde nur für dieses Forum gemacht
private static final String[] KEYWORDS_START = {
       "/*", "SELECT", "FROM", "UPDATE", "DROP", "DELETE", "INSERT", "INTO", "VALUES", "AS", "CREATE", "ALTER",  "AND", "OR",
       "FROM", "WHERE", "IN", "[", "]", "{", "}", "(", ")" ,"|", "&", "LIKE", "ORDER", "BY", "DISTINCT", "UNION", "TABLE",
       "NOT", "NULL", "AUTO_INCREMENT", ";", "BETWEEN", "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "JOIN", "PRIMARY KEY"
   };
   private static final String[] KEYWORDS_END = {
       "*/", "SELECT", "FROM", "UPDATE", "DROP", "DELETE", "INSERT", "INTO", "VALUES", "AS", "CREATE", "ALTER",  "AND", "OR",
       "FROM", "WHERE", "IN", "[", "]", "{", "}", "(", ")" ,"|", "&", "LIKE", "ORDER", "BY", "DISTINCT", "UNION", "TABLE",
       "NOT", "NULL", "AUTO_INCREMENT", ";", "BETWEEN", "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "JOIN", "PRIMARY KEY"
   };

class StyleListener implements LineStyleListener {
        private final String[] KEY_START;
        private final String[] KEY_END;

        private Color COMMENT_COLOR = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN);

        private final List<int[]> commentOffsets;

        public StyleListener(String[] start, String[] end) {
            this.KEY_START = start;
            this.KEY_END = end;
            commentOffsets = new ArrayList<int[]>();
        }

        public void refreshMultilineComments(String text) {
            commentOffsets.clear();
           
            for (int index = 0; index < KEY_START.length; index++) {
                for (int pos = text.indexOf(KEY_START[index]); pos > -1; pos = text.indexOf(KEY_START[index], pos)) {
                    int[] offsets = new int[2];
                    offsets[0] = pos;

                    pos = text.indexOf(KEY_END[index], pos);

                    offsets[1] = pos == -1 ? text.length() - 1 : pos + KEY_END[index].length() - 1;
                    pos = offsets[1];

                    commentOffsets.add(offsets);
                }
            }
        }

        @Override
        public void lineGetStyle(LineStyleEvent event) {
            List<StyleRange> styles = new ArrayList<StyleRange>();

            int length = event.lineText.length();

            for (int i = 0, n = commentOffsets.size(); i < n; i++) {
                int[] offsets = (int[]) commentOffsets.get(i);
                if (offsets[0] > event.lineOffset + length) break;
                if (offsets[0] <= event.lineOffset + length && offsets[1] >= event.lineOffset) {
                    int start = Math.max(offsets[0], event.lineOffset);

                    int len = Math.min(offsets[1], event.lineOffset + length) - start + 1;

                    styles.add(new StyleRange(start, len, COMMENT_COLOR, null, SWT.BOLD | SWT.ITALIC));
                }
            }

            event.styles = (StyleRange[]) styles.toArray(new StyleRange[0]);
        }
    }


Leider kann die StyledText Komponente nur einen LineStyleListener haben und nicht mehrere.
Somit weiß ich z.b. nicht wie ich die kommentare von den anderen Trennen soll.
Ebenso ist es sehr unschön, dass diese Lösung es nicht trennt ob es wirklich das Keyword ist, welches farblich hinterlegt werden soll.
Also damit meine ich, dass wenn ich "SELECT column1 AS IchBinColumn1 FROM Table1" schreibe oder ob ich nur das Wort "das" schreibe, würde er mir das Wort "das" mit dem "as" auch farblich markieren, obwohl es ja nicht wirklich das ist, was er machen soll.
Ebenso finde ich, ist diese Lösung eher unperformant oder?

Wie dem auch sei. Ich suche jedenfalls einen einfach zu realisierenden und korrekt ausführenden Algorythmus.
Kann mir dabei jemand helfen?
 

Christopher25

Bekanntes Mitglied
Aus gegebenem Anlass habe ich mich nun entschieden, die Applikation nicht weiter in SWT
zu programmieren sondern steige auf JavaFX um.
Das hat etwas mit dem RAM-Speicher Verbrauch von SWT zutun, welches eher schlecht als Recht ist.
Da aber ein Algorythmus eigentlich etwas ist, was Sprachenübergreifend funktionieren soll/te, wäre
ich euch trozdem sehr verbunden, wenn mir jemand weiterhin bei dieser Sache Unterstützung geben könntet.
 

lam_tr

Top Contributor
Hallo Christopher25,

wenn du auf Basis von JavaFX machen willst, kann ich dir die lösung von Tom Schindl sehr gut empfehlen.

https://tomsondev.bestsolution.at/2...and-a-code-dev-environment-written-in-javafx/

Du kannst deine Regeln deklarativ beschreiben und daraus den Editor generieren, ist sehr einfach und vor allem richtig cool.

Viele Grüße
lam

P.S. Auf seine Blog Seite findest du weitere Tutorials zu dem Thema, außerdem unterstützt der Editor Autocompletion, Outline und viele Schönheiten.
 

dzim

Top Contributor
@lam_tr - hast du das schon ausprobiert? Ich hab mir bisher nur die Videos angeschaut, aber noch keine Lust gehabt, daraus etwas selbst zu machen... ;):D
 

Christopher25

Bekanntes Mitglied
Ich bin noch dabei die Gui in JavaFX umzuschreiben.
Bin damit schon fast soweit, dass der Stand wie von dem von SWT gleich kommt.
Jedoch merke ich gerade, dass mein Speicherproblem nicht wirklich besser geworden ist.

Die Sache ist die, dass ich eine Tabelle innerhalb eines Tabs habe.
Wenn ich den Tab schließe, werden nur wenige MB freigegeben und vieles bleibt übrig.
Ich habe bei dem Tab einen setOnClose EventHandler drangesetzt, der mir beim Schließen
alle Referenzen innerhalb der Tabelle weghauen soll, da er das anscheinend nicht beim Löschen der Gui-Komponente macht.
Hier der Code:
Java:
tab.setOnClosed(new EventHandler<Event>() {
                @Override
                public void handle(Event arg0) {
                    BorderPane content = (BorderPane) tab.getContent();
                    for (Node child : content.getChildren()) {
                        if (child instanceof TableView) {
                            TableView tableView = (TableView) child;
                            for (Object item : tableView.getItems()) {
                                SQLTableValue[] values = (SQLTableValue[]) item;
                                for (SQLTableValue value : values) {
                                    value.setType(null);
                                    value.setValue(null);
                                    value = null;
                                    item = null;
                                }
                                values = null;
                            }
                            tableView.setItems(null);
                            tableView = null;
                        }
                    }
                }
            });
Ich mach sicher einige Sachen doppelt und unnötig, aber ich will eigentlich auf Nummer sicher gehen.
Es kann nicht sein, wenn ich 10 Tabs offen hab mit Tabellen drin, diese dann Schließe, dass ich immernoch ca. 400+ MB im RAM liegen hab.
Und umso mehr Tabellen ich vorher offen hatte, umso voller wird der dann nach und nach.
 

lam_tr

Top Contributor
Hallo dzim,

ich habe jeden Blog Eintrag von Tom Schindl verfolgt, und als er das Tutorial zum Smart Code Editor rausgebracht habe, habe ich sofort getestet.

Lief alles ganz gut und vor allem sehr schnell.

Wir dürfen hier kein JavaFX benutzen, sonst würde ich es an sehr vielen Stellen verwenden können für unsere Custom Formate. Momentan ist es halt so dass ich ein bissle am StyledText rumfrimmel, ist wirklich keine saubere Lösung.

Ich würde mal sagen, auf die schnelle über Smart Editor bräuchte man ca 30 min bis man da alles generiert hat. In 30 min hätte ich das niemals in SWT oder reines JavaFX gebacken bekommen.

Code:
Ich hab mir bisher nur die Videos angeschaut, aber noch keine Lust gehabt, daraus etwas selbst zu machen... ;):D
Es lohnt sich auf jeden Fall darein zu schauen.

Ich habe vor allem auf der letzten EclipseCon seinen Vortrag gehört und habe dann die Partitioning und die Aufteilung der Grammatik verstanden.

Viele Grüße
lam
 

dzim

Top Contributor
@lam_tr ja die DSL für die Grammatik war mir - nur vom reinem zuschauen - nicht sofort verständlich. Ansonsten ist sein Blog lediglich einer von vielen, die ich immer wieder mal beobachte...

@Christopher25 Leider kann ich, ohne den Code des Erstellens der Tabelle zu kennen, nicht sagen, was genau das Problem ist. Es gibt Tools zum Monitoren einer JVM (VisualVM im JDK z.B.). Vielleicht kannst du damit mal schauen, ob du ein paar Hinweise bekommst.
Ansonsten kann du auch mit Scenic View (http://fxexperience.com/scenic-view/) schauen, was sich noch alles auf deinem Scene Graph befindet. Vielleicht hilft dir das.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich mach sicher einige Sachen doppelt und unnötig, aber ich will eigentlich auf Nummer sicher gehen.
Es kann nicht sein, wenn ich 10 Tabs offen hab mit Tabellen drin, diese dann Schließe, dass ich immernoch ca. 400+ MB im RAM liegen hab.
Und umso mehr Tabellen ich vorher offen hatte, umso voller wird der dann nach und nach.

Von der JVM reservierter RAM oder innerhalb der JVM reservierter Speicher?

Den RAM gibt die JVM, auch wenn intern nicht mehr belegt, nicht zwingend direkt frei, uU behält die den für die gesamte restliche Laufzeit.

Wenn innerhalb der JVM der Speicher auch belegt ist, dann werden irgendwo noch irgendwelche Referenzen liegen. Mal mit nem Profiler durchgehen, oder mit Scenic View mal gucken.

Generell ist Java aber auch nicht die Speichersparendste Sprache...
 

Christopher25

Bekanntes Mitglied
Nun ich habe VisualVM bereits benutzt und halt gesehen, dass der Speicher meistens von meinen Objekten "SQLRow" belegt wird.
Diese sollten eigentlich garkeine Referenz mehr besitzen, deswegen habe ich oben ja auch den Code mit der Schleife beim closen eines tabs gepostet.
Nützt es etwas, die TableView nicht mit einer Liste von SQLRows zu befüllen sondern mit einer Liste von
WeakReference<SQLRow> ??
 

mrBrown

Super-Moderator
Mitarbeiter
Nun ich habe VisualVM bereits benutzt und halt gesehen, dass der Speicher meistens von meinen Objekten "SQLRow" belegt wird.
Diese sollten eigentlich garkeine Referenz mehr besitzen, deswegen habe ich oben ja auch den Code mit der Schleife beim closen eines tabs gepostet.
Nützt es etwas, die TableView nicht mit einer Liste von SQLRows zu befüllen sondern mit einer Liste von
WeakReference<SQLRow> ??
Vermutlich nicht, irgendwo liegt ja trotzdem noch eine Referenz rum, die das aufräumen verhindert, die in der TableView wird ja genullt.

Ist der GC überhaupt schon gelaufen?
 

Christopher25

Bekanntes Mitglied
Hallo Christopher25,

wenn du auf Basis von JavaFX machen willst, kann ich dir die lösung von Tom Schindl sehr gut empfehlen.

https://tomsondev.bestsolution.at/2...and-a-code-dev-environment-written-in-javafx/

Du kannst deine Regeln deklarativ beschreiben und daraus den Editor generieren, ist sehr einfach und vor allem richtig cool.

Viele Grüße
lam

P.S. Auf seine Blog Seite findest du weitere Tutorials zu dem Thema, außerdem unterstützt der Editor Autocompletion, Outline und viele Schönheiten.

Der benutzt irgendwas mit Python oder?
 

lam_tr

Top Contributor
Also wenn du dieses Video meinst
.

Diese Anwendung / Editor ist mit Hilfe von Toms Framework Code Compensator generiert worden.
An sich muss du nur noch konfigurieren mit der DSL und kannst die Anwendung erstellen lassen.

Es supported Highlighting, Autocompletion, Outline, Theming, etc.
 

Christopher25

Bekanntes Mitglied
Und diesen Editor kann ich dann als Komponente in mein Programm einfügen?
Also ich brauche schon etwas, was ich als JavaFX.Node irgendwo innerhalb meiner Applikation
Integrieren kann^^
 

lam_tr

Top Contributor
Guten morgen,

ich habe gerade den Code angeguckt, du sollst da org.eclipse.fx.code.editor.fx.TextEditor benutzen, was wiederum von Node erbt, passt also.

Grüße
lam
 

dzim

Top Contributor
Sieht noch nett aus - vergleichbar einfach. Der Texteditor, den @lam_tr vorgeschlagen hat, ist halt eventuell etwas mächtiger. Aber wenn du das nicht brauchst, ist dass sicher auch OK.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
J Spiel mit Java AWT, Swing, JavaFX & SWT 9
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
N FXMLLoader.load java.lang.RuntimeException: Gradle AWT, Swing, JavaFX & SWT 2
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
V Java-Zeichenfeld mit AWT AWT, Swing, JavaFX & SWT 3
N java Gui friert scheinbar zufällig ein AWT, Swing, JavaFX & SWT 5
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
P Java Fx einrichten AWT, Swing, JavaFX & SWT 2
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
MiMa Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Trèfle Ausklappbare Diagramme in Java AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
K JAVA FX Constraints AWT, Swing, JavaFX & SWT 2
F Java FX und webcam AWT, Swing, JavaFX & SWT 1
T Wie kann man in java aufwendige grafiken programmieren AWT, Swing, JavaFX & SWT 1
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
J Java SWT Tabelleninhalt formattieren AWT, Swing, JavaFX & SWT 10
Blender3D Falsche Werte mit Java Toolkit Screensize AWT, Swing, JavaFX & SWT 4
K Swing AWT-EventQueue-1 java.lang.NoClassDefFoundError bei setVisible(true) AWT, Swing, JavaFX & SWT 3
A Java Programm gestalten AWT, Swing, JavaFX & SWT 4
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
I Java Bildfarbe ändern wie bei Photoshop AWT, Swing, JavaFX & SWT 9
R JavaFX Java FXML Vererbung in Klassen AWT, Swing, JavaFX & SWT 9
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
J Parallele Aktionen in Java FX richtig durchführen. AWT, Swing, JavaFX & SWT 5
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
M JavaFX java.lang.IllegalStateException: Location is not set. AWT, Swing, JavaFX & SWT 9
L Java- CardLayout AWT, Swing, JavaFX & SWT 10
M Java zeichnet nicht pixelgenau AWT, Swing, JavaFX & SWT 40
B Swing Eclipse is running under 0, but this Java project has a 1.6 Java compliance level, so WindowBuilder AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
S Java Gui AWT, Swing, JavaFX & SWT 5
R Sierpinski Dreieck mit Java FX AWT, Swing, JavaFX & SWT 4
Flynn java.lang.UnsupportedOperationException: Not supported yet AWT, Swing, JavaFX & SWT 7
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L java.lang.NullPointerException - Fehlermeldung AWT, Swing, JavaFX & SWT 2
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben