Hallo zusammen.
Nun wird's knifflig, befürchte ich, denn die Forumsuche und Google sagen mir: Hier gibt es mehr Suchende als Antworten
Aber ich habe erst einmal Fragen genereller Natur, vor allem wie ich meine Herangehensweise gestalten sollte.
Der Hintergrund
In der Anwendung unserer Firma gibt es Textkomponenten die theo. beliebig viel Text behinalten können. Für diese Komponenten sollen aktuell folgende Anforderungen gelten:
- Der Text ist einfacher (plain) Text, also nichts mit Formatierung (fett, kursiv), Färbung und Grafiken (-> Problem 1)
- Der Text hat eine feste Zeilenlänge, d.h. es muss ein automatischer Umbruch erfolgen, wenn eine Zeile länger wird (-> Problem 2)
- Die Textkomponente wird (unabhängig von der möglichen Länge des Textes) immer auf voller Breite angezeigt (-> Anmerkung 1)
Bisher also genügt eine JTextArea, nur dieser eigenwillige Zeilenumbruch (Problem 2) macht mir etwas sorgen.
Anmerkung 1 Layouting
Für den autom. Zeilenumbruch können wir leider nicht die Breite der Textkomponente
heranziehen. Zum Einen würde es Probleme beim Vergrößern des Fensters geben, zum Anderen passt es auch auf der Standardgröße nicht ganz. Es sieht nicht so aus, dass das Textfeld doppelt so breit ist, wie die mögliche Zeilenlänge, aber es ist z.B. so, dass 91 Zeichen in eine Zeile passen, aber nur 85 erlaubt sind.
Beim Speichern des Textes nämlich wird der Text in diese MaxZeilenLänge-Blöcke unterteilt und beim Laden entsprechend mit Zeilenumbrüchen wieder zusammengesetzt. Was
ich vermeiden muss ist, dass man Texte anders (formatiert was Leerzeichen, Zeilenumbrüche etc. anbelangt) zurückbekommt, als man sie gespeichert hat.
Aber vielleicht hat hierzu jemand weitere Anmerkungen, wie man es optisch besser hinbekommt. Die Textkomponente sitzt übrigens in einer JScrollPane, die nur vertikal scrollt.
Anmerkung 2 Priorität
Von meinem Problemen die höchste Priorität hat das Umbrechen, da RTF / HTML erstmal Zukunftsmusik ist. Die Textkomponente
(aktuell JEditorPane auf text/plain-Modus) wird bereits korrekt gelayoutet.
Problem 1 Texttyp
Wie bereits erwähnt haben wir bisher nur einfachen Text. Es gibt aber bereits Anfragen, bzw. das Vorhaben, dies *bald* zu erweitern, sodass man den Text einfach formatieren kann (fett, kursiv, Schriftfarbe) womit wir wohl zu sowas wie RTF kommen. In 10 Jahren kommt wahrscheinlich der Wunsch, HTML darstellen zu können
Meiner Meinung nach wäre es daher überflüssig, mit der JTextArea zu starten, sondern gleich eine JEditorPane zu haben, damit man nachher nicht womöglich viel umstellen muss.
Problem 2 Zeilenumbruch
Der Text soll automatisch umgebrochen werden, wenn eine Zeile länger als x Zeichen wird (meist ist x = 85, hat was mit den Speichermethoden zutun auf die ich leider wenig Einfluss habe).
Ich denke dass ich anhand der Anforderungen ein eigenes LineWrapping (was mit WordWrapping sein soll, weiß ich selbst noch nicht...) implementieren muss. Ich habe schonmal herumgespielt:
Das tut natürlich nur sehr grob das was man ich später erwartet, aber es ist ein Ansatz.
Anmerkung 3
Wie später dann Problem 1 und Problem 2 zusammenarbeiten sollen, ist mir etwas unklar. Durch zB HTML-Tag wird eine Zeile definitiv länger als der eigentliche Text wodurch eine Schere zwischen Darstellungszeilenlänge und Speicherzeilenlänge entsteht. Aber auch wenn beim Speichern alles in x-Zeichen-Blöcke zerhackt wird, dürfte es theo. kein Problem sein, wenn am Ende wieder ein gültiges HTML herauskommt. Was dann mit der Darstellungslänge von x Zeichen wird, steht noch offen, sprich womöglich wird sie aufgelöst.
Die Fragen
* Sollte ich direkt mit JEditorPane beginnen, in Hinblick auf die Zukunft, oder erst einmal die einfachere JTextArea? Und würde das eine oder andere mir beim eigensinnigen Umbrechen mehr helfen?
* Zum Implementieren des eigenen Wrappings ist der o.g. Ansatz über ein eigenes java.text.Document sinnvoll oder sollte man eher ein EditorKit implementieren?
(Mir fehlen hierzu Erfahrungen bzgl dieser Swing-Komponenten aber ich möchte auch von der Programmierung her sauber bleiden und meine daher, dass das Umbrechen
eine Sache des Models (Document) ist.)
* Hat jemand Anmerkungen zur generellen Vorgehensweise / Ideen / etc. Ich würde also mit einer JEditorPane und eigener Document-Klasse beginnen.
Hier schon das StyledDocument, damit man später eher Formatierungen anzeigen kann.
* Und, vielleicht am wichtigsten, kennt jmd Literatur/Links zu dem Thema?
So, ich schreibe immer sehr ausführlich und hoffe niemanden damit zu verwirren oder abzuschrecken. Ich freue mich jedenfalls auf Rückmeldungen
Nun wird's knifflig, befürchte ich, denn die Forumsuche und Google sagen mir: Hier gibt es mehr Suchende als Antworten
Aber ich habe erst einmal Fragen genereller Natur, vor allem wie ich meine Herangehensweise gestalten sollte.
Der Hintergrund
In der Anwendung unserer Firma gibt es Textkomponenten die theo. beliebig viel Text behinalten können. Für diese Komponenten sollen aktuell folgende Anforderungen gelten:
- Der Text ist einfacher (plain) Text, also nichts mit Formatierung (fett, kursiv), Färbung und Grafiken (-> Problem 1)
- Der Text hat eine feste Zeilenlänge, d.h. es muss ein automatischer Umbruch erfolgen, wenn eine Zeile länger wird (-> Problem 2)
- Die Textkomponente wird (unabhängig von der möglichen Länge des Textes) immer auf voller Breite angezeigt (-> Anmerkung 1)
Bisher also genügt eine JTextArea, nur dieser eigenwillige Zeilenumbruch (Problem 2) macht mir etwas sorgen.
Anmerkung 1 Layouting
Für den autom. Zeilenumbruch können wir leider nicht die Breite der Textkomponente
heranziehen. Zum Einen würde es Probleme beim Vergrößern des Fensters geben, zum Anderen passt es auch auf der Standardgröße nicht ganz. Es sieht nicht so aus, dass das Textfeld doppelt so breit ist, wie die mögliche Zeilenlänge, aber es ist z.B. so, dass 91 Zeichen in eine Zeile passen, aber nur 85 erlaubt sind.
Beim Speichern des Textes nämlich wird der Text in diese MaxZeilenLänge-Blöcke unterteilt und beim Laden entsprechend mit Zeilenumbrüchen wieder zusammengesetzt. Was
ich vermeiden muss ist, dass man Texte anders (formatiert was Leerzeichen, Zeilenumbrüche etc. anbelangt) zurückbekommt, als man sie gespeichert hat.
Aber vielleicht hat hierzu jemand weitere Anmerkungen, wie man es optisch besser hinbekommt. Die Textkomponente sitzt übrigens in einer JScrollPane, die nur vertikal scrollt.
Anmerkung 2 Priorität
Von meinem Problemen die höchste Priorität hat das Umbrechen, da RTF / HTML erstmal Zukunftsmusik ist. Die Textkomponente
(aktuell JEditorPane auf text/plain-Modus) wird bereits korrekt gelayoutet.
Problem 1 Texttyp
Wie bereits erwähnt haben wir bisher nur einfachen Text. Es gibt aber bereits Anfragen, bzw. das Vorhaben, dies *bald* zu erweitern, sodass man den Text einfach formatieren kann (fett, kursiv, Schriftfarbe) womit wir wohl zu sowas wie RTF kommen. In 10 Jahren kommt wahrscheinlich der Wunsch, HTML darstellen zu können
Meiner Meinung nach wäre es daher überflüssig, mit der JTextArea zu starten, sondern gleich eine JEditorPane zu haben, damit man nachher nicht womöglich viel umstellen muss.
Problem 2 Zeilenumbruch
Der Text soll automatisch umgebrochen werden, wenn eine Zeile länger als x Zeichen wird (meist ist x = 85, hat was mit den Speichermethoden zutun auf die ich leider wenig Einfluss habe).
Ich denke dass ich anhand der Anforderungen ein eigenes LineWrapping (was mit WordWrapping sein soll, weiß ich selbst noch nicht...) implementieren muss. Ich habe schonmal herumgespielt:
Java:
public class MyTextDocument extends DefaultStyledDocument
{
protected int m_lineLength = 85;
protected String m_lineBreak = System.getProperty("line.separator");
public MyTextDocument(int linelength)
{
super();
m_lineLength = linelength;
} //Konstruktor(int)
@Override
public void insertString(int offset, String str, AttributeSet attrs) throws BadLocationException
{
int rest = offset % m_lineLength;
if (rest == 0 && offset != 0)
{
super.insertString(offset, m_lineBreak, attrs);
offset += m_lineBreak.length();
} //if
super.insertString(offset, str, attrs);
} //void insertString(int, String, AttributeSet)
} //class MyTextDocument
Anmerkung 3
Wie später dann Problem 1 und Problem 2 zusammenarbeiten sollen, ist mir etwas unklar. Durch zB HTML-Tag wird eine Zeile definitiv länger als der eigentliche Text wodurch eine Schere zwischen Darstellungszeilenlänge und Speicherzeilenlänge entsteht. Aber auch wenn beim Speichern alles in x-Zeichen-Blöcke zerhackt wird, dürfte es theo. kein Problem sein, wenn am Ende wieder ein gültiges HTML herauskommt. Was dann mit der Darstellungslänge von x Zeichen wird, steht noch offen, sprich womöglich wird sie aufgelöst.
Die Fragen
* Sollte ich direkt mit JEditorPane beginnen, in Hinblick auf die Zukunft, oder erst einmal die einfachere JTextArea? Und würde das eine oder andere mir beim eigensinnigen Umbrechen mehr helfen?
* Zum Implementieren des eigenen Wrappings ist der o.g. Ansatz über ein eigenes java.text.Document sinnvoll oder sollte man eher ein EditorKit implementieren?
(Mir fehlen hierzu Erfahrungen bzgl dieser Swing-Komponenten aber ich möchte auch von der Programmierung her sauber bleiden und meine daher, dass das Umbrechen
eine Sache des Models (Document) ist.)
* Hat jemand Anmerkungen zur generellen Vorgehensweise / Ideen / etc. Ich würde also mit einer JEditorPane und eigener Document-Klasse beginnen.
Hier schon das StyledDocument, damit man später eher Formatierungen anzeigen kann.
* Und, vielleicht am wichtigsten, kennt jmd Literatur/Links zu dem Thema?
So, ich schreibe immer sehr ausführlich und hoffe niemanden damit zu verwirren oder abzuschrecken. Ich freue mich jedenfalls auf Rückmeldungen