Zeichenketten in GUIs (toString() vermeiden?)

mla.rue

Bekanntes Mitglied
Ich habe folgende Aussage jetzt schon sehr oft gelesen, ganz besonders in diesem Forum, aber nie eine Erklärung wieso und wie man es sonst macht (oder auch anders gesagt, die Antwort war wohl schon hier oder da vorhanden, mir ist es aber irgendwie ständig entgangen:()

Ich kann es nicht oft genug sagen. toString() ist für Debugging-Zwecke und Logausgaben. Sie ist nicht für die Ausgabe auf GUIs gedacht!!!! Das ist ein eklatanter Missbrauch dieser Methode und wird Dir bei der nächsten Änderung auf die Füße fallen.

Ich muss da leider fragen, wie macht man es dann? Ich habe z.B. folgenden Code

Java:
StringBuilder sb = new StringBuilder();
int n;

Random r = new Random();
for (int i = 0; i < 4; i++) {
    n = r.nextInt(10) + 48;
    sb.append((char) n);
}
for (int i = 0; i < 2; i++) {
    n = r.nextInt(26) + 65;
    sb.append((char) n);
}
for (int i = 0; i < 4; i++) {
    n = r.nextInt(10) + 48;
    sb.append((char) n);
}

txtKHFallnummer.setText(sb.toString()); //txtKHFallnummer ist ein JTextField

...
...

strData[19] = cbxKommArt1.getSelectedItem().toString(); //cbxKomm1Art ist eine JComboBox
txtKommArt1.setText(strData[19]); //txtKommArt1 ist ein JTextField

Über den Sinn/Unsinn eines StringBuilders im ersten Beispiel kann man streiten (im Vergleich zur String concatenation), man kann hier aber auch richtige Zeichenketten zusammenfügen. Die Kernfrage ist: wie mache ich aus dem StringBuilder einen String, den ich im JTextField einsetzen kann, wenn toString() ein Missbrauch des Zweckes ist?

Gleiches im zweiten Beispiel, das eingelesene Item ist ein Object, kann ich in einer Object Variable speichern, nur wenn ich das später in einem Textfeld haben will, brauche ich es wieder als String.

Was nu also?
 
S

SlaterB

Gast
den zu deinem Zitat zugehörigen Thread verschweigst du, aber ist ja schnell zu finden heutzutage, zumindest für dieses Forum
http://www.java-forum.org/java-basics-anfaenger-themen/146818-string-metode-ueberschreiben.html

es ist schon ein gewisser Unterschied, ob man toString() von Standardklassen wie StringBuilder oder ganz individuelle Klassen meint,
StringBuilder.toString() kann nur eine Rückgabe liefern, genau richtig so, bzw. Schuld der API, hätte ne andere Methode anbieten können

aber ein fachliches Objekt, in der DB gespeichert, was ist mit dem? das wird in der GUI angezeigt,
wie im Gemecker angesprochen während der Verarbeitung vielleicht im Log auftauchen,
vielleicht sogar in Java-Exceptions, mir fällt allerdings kein Standardfall ein, eigene Exceptions,
will man dort genau die GUI-Ausgabe sehen?
vielleicht gibt es verschiedene GUIs bzw. auch eine Webanwendung die das Objekt nutzt, verschiedene Spracheinstellungen,
unnötige GUI-Details wie Textformatierung wandern in die allgemeine Datenklasse,

all das kann vermieden werden,
Date gibt in seinem toString() auch gewisse Darstellung aus, für die GUI benutzt man aber wohl lieber SimpleDateFormat

edit: für eine Person direkt den Namen pur zurückzugeben kann aber durchaus ungefährlich sein,
muss man nicht zu kritisch sehen,

es ist auch immer wertvoll, Fehler durchaus zu machen, zu verstehen und dann aus Eigenantrieb zu vermeiden,
statt blind Regeln zu verfolgen, ohne zu wissen warum
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Ich denke der Haupt-Fall, worauf sich das bezog, war z.B. bei Renderern in JLists usw. Wenn man eine Klasse
Java:
class Person {
    public String toString() { return name; }
}
in eine JList packt, wird in der JList eben genau toString, also der Name ausgegeben. Aber man muss sich eben genau überlegen, ob man immer davon ausgehen kann, dass dort etwas geliefert wird, was man in seiner JList sehen will.
(Vielleicht hatte ich da aber auch was falsch in Erinnerung oder falsch interpretiert)
 
N

nillehammer

Gast
Über den Sinn/Unsinn eines StringBuilders im ersten Beispiel kann man streiten (im Vergleich zur String concatenation), man kann hier aber auch richtige Zeichenketten zusammenfügen. Die Kernfrage ist: wie mache ich aus dem StringBuilder einen String, den ich im JTextField einsetzen kann, wenn toString() ein Missbrauch des Zweckes ist?

Gleiches im zweiten Beispiel, das eingelesene Item ist ein Object, kann ich in einer Object Variable speichern, nur wenn ich das später in einem Textfeld haben will, brauche ich es wieder als String.
Leider bin ich da missverstanden worden. Ich habe nicht geschrieben, dass es grundsätzlich schlecht ist, von irgendwas toString() aufzurufen. Das wäre geradezu bescheuert. Ich habe nur gesagt, man soll bei seinen eigenen Klassen toString() so überschreiben, dass es für Debuggingzwecke aussagefähige Ergebnisse liefert und nicht für die Darstellung in irgend einer GUI. Dafür gibt es je nach GUI-Plattform andere Mechanismen. Bei Swing z.B. Renderer. Wenn man in so einem Renderer eine Ausgabe baut, wird man natürlich gelegentlich einen StringBuilder für das Bauen der Ausgabe benutzen und dann dessen toString()-Ergebnis zurück geben. Denn genau dafür ist StringBuilder da.
 
S

SlaterB

Gast
das aktuelle Posting in dem anderen Thread passt ja bestens ;)
http://www.java-forum.org/java-basi...tring-metode-ueberschreiben-2.html#post984008

Das Element das jetzt hinzugefügt wird, ist der Nachname der Person, den ich in der Personenklasse in der toString() Methode als Rückgabewert habe...
Was aber, wenn ich jetzt die Kundennummer UND den Nachname in der Combobox anzeigen lassen möchte?
Ich kann ja in der toString() keine zwei rückgabewerte haben
Siehst Du? Ich habe doch geschrieben, dass toString überschreiben ne blöde Idee ist. Nun merkst Du auch warum. Es gibt für fast jedes GUI-Element bei Swing einen Renderer. DEN musst Du implementieren und nichts anderes. Ich glaube, das habe ich auch schon geschrieben...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Objekte von 2 GUIs zusammenfassen AWT, Swing, JavaFX & SWT 2
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
V Guis erstellen mit FXML und javaFX gemischt AWT, Swing, JavaFX & SWT 5
U Swing Fragen bezüglich Multithreaded GUIs (Grundlagen): AWT, Swing, JavaFX & SWT 3
J LookAndFeel Java-GUIS AWT, Swing, JavaFX & SWT 19
2 Werde Java GUIs immer noch mit dem in die Jahre gekommen Swing gemacht? AWT, Swing, JavaFX & SWT 12
newcron Suche die hässlichsten Swing GUIs AWT, Swing, JavaFX & SWT 4
P seltsame Performance Probleme bei 2 Guis abhängig vom Aufruf AWT, Swing, JavaFX & SWT 8
2 Schönere GUIs? AWT, Swing, JavaFX & SWT 9
P richtige "Architektur" mit GUIs AWT, Swing, JavaFX & SWT 2
M Swing bremst GUIs von allen Programmen aus AWT, Swing, JavaFX & SWT 8
O Strukturieren von GUIs AWT, Swing, JavaFX & SWT 22
K UNICODE ZEICHEN in den SWing-GUIs AWT, Swing, JavaFX & SWT 4
K welches package muss ich angeben um GUIs zu erstellen? AWT, Swing, JavaFX & SWT 5
A Automatisierter Test von Swing GUIs AWT, Swing, JavaFX & SWT 3
M Wie machen die diese GUIs? AWT, Swing, JavaFX & SWT 2
G GUIs miteinander verknüpfen AWT, Swing, JavaFX & SWT 5
S Zeilenumbruch jTextArea mit toString AWT, Swing, JavaFX & SWT 2
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
G Swing Component.toString() was bedeutet flags AWT, Swing, JavaFX & SWT 8
G toString -> TextArea AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben