# Eigenen Parser schreiben



## - Java - (1. Mrz 2011)

Ich möchte mir gerne ein eigenes Control schreiben, in dem man z.B. mit BBCodes oder anderen eigenen Befehlen arbeiten kann z.B.: ==Text== für fetten Text, usw.
Dazu muss ich den ganzen Text nach den Tags durchsuchen und diese dann dementsprechend formatiert darstellen.
Das Ganze sollte nicht mit einem StyledDocument, JTextPanes, etc. funktionieren, sondern ich würde es ganz gerne auf ein Panel oder Canvas zeichnen (so kann man z.B. den Text nicht kopieren).
Nur wenn ich jetzt einen String oder ein Icon zeichne, verschwinden immer die schon davor gezeichneten Elemente.
Vielleich könnte mir da jemand weiterhelfen oder auch andere Vorschläge/Ansätze vorschlagen, wie man das ganze Control am besten/einfachsten angeht. 

Danke schonmal im Vorraus.


----------



## SlaterB (1. Mrz 2011)

niemals getGraphics() aufrufen, höchstens repaint(),
in der überschriebenen paintComponent()-Methode von einer komplett leeren Zeichenfläche ausgehen,
also komplett alles neumalen,
daher das Geparste nicht einmalig in einen Zeichenbefehl überführen, sondern dauerhaft abspeichern,
Liste von Zeichenbefehlen oder so, in eigenen Klassen modelliert wenn es nichts vorhandenes brauchbares gibt


----------



## Blakh (1. Mrz 2011)

Du verwendest JTextPanes nicht, damit es keiner kopieren kann?!?! Wieso nimmst du nicht einfach :


```
textPane.setEnabled(false);
```

Es ändert sich per default zwar die Schriftfarbe, das kann man aber wieder ändern.


----------



## Simon_Flagg (1. Mrz 2011)

wie wärs mit einem jlabel? (entweder einer für alles oder je einer für jede zeile)

lg


----------



## Michael... (1. Mrz 2011)

Blakh hat gesagt.:


> Du verwendest JTextPanes nicht, damit es keiner kopieren kann?!?! Wieso nimmst du nicht einfach :
> 
> 
> ```
> ...


Bin mir nicht sicher aber den Inhalt müsste man trotzdem noch kopieren können.

Würde aber trotzdem JTextPane o.ä. verwenden. Diese aber nicht als Komponente in die Applikation einfügen sondern einfach nur als Renderer verwenden - also sich auf eine Komponente malen lassen.


----------



## - Java - (1. Mrz 2011)

SlaterB hat gesagt.:


> niemals getGraphics() aufrufen, höchstens repaint(),
> in der überschriebenen paintComponent()-Methode von einer komplett leeren Zeichenfläche ausgehen,
> also komplett alles neumalen,
> daher das Geparste nicht einmalig in einen Zeichenbefehl überführen, sondern dauerhaft abspeichern,
> Liste von Zeichenbefehlen oder so, in eigenen Klassen modelliert wenn es nichts vorhandenes brauchbares gibt



Wenn man alles neumalt, hängt es dann nicht immer wenn schon zuviele Strings gezeichnet wurden?


----------



## SlaterB (1. Mrz 2011)

mehr als eine Bildschirmseite muss nun wirklich nicht gemalt werden, das sollte schnell genug gehen,
aber diese auszuwählen, falls es mehr gibt, kann schon Komplexität reinbringen,

letzlich kann man alles mögliche beliebig kompliziert machen, die Entwicklung effizienter Darstellungen für Office und Spiele (3D) beschäftigte die letzten Jahrzehnte, füllt dicke Bücher,
ich habe mich auf paar ganz grundlegende Anfänge passend zur Swing-Philosophie mit paintComponent() bezogen


----------



## Blakh (1. Mrz 2011)

Michael... hat gesagt.:


> Bin mir nicht sicher aber den Inhalt müsste man trotzdem noch kopieren können.
> 
> Würde aber trotzdem JTextPane o.ä. verwenden. Diese aber nicht als Komponente in die Applikation einfügen sondern einfach nur als Renderer verwenden - also sich auf eine Komponente malen lassen.



Wüsste nicht wie, da du es ja nicht markieren kannst. Bei .setEditable(false) kann man es noch kopieren.


----------



## Michael... (1. Mrz 2011)

Oh, hatte geistig wohl setEditable() gelesen ;-)


----------

