toString überschreiben

Hallo,

ich steh glaube ich gerade wiedermal auf dem Schlauch. Ich habe ein Objekt einer Klasse ClassA und will dieses in eine JCombobox einfügen. Dazu müsste ich aber die toString-Methode überschreiben um den gewünschten Eintrag zu erhalten.

Ich habe folgendes versucht:

...
ClassA a = getClassA();
ClassB b = (ClassB)a;
box.addItem(b);
...


class ClassB extends ClassA {
 public String toString() {
 return "ich bin ClassB";
 }
}

Das ergibt aber eine ClassCastException. Kann ich die toString Methode irgendwie anders überschreiben ohne ClassA anfassen zu müssen? Bin für jeden Tip dankbar.

Gruß
Jochen

Hallo Jochen,

die ClassCastException tritt sicherlich in folgender Zeile auf:

ClassB b = (ClassB)a;

Denn dein Objekt a ist vom Typ ClassA, daran ist nichts zu ändern.

Wo in deinem Code legst du denn dein ClassB-Objekt an? (mit „b = new ClassB()“ o.ä.)
Das brauchst du nämlich, sonst hast du immer ein ClassA-Objekt (ohne to überschriebene toString()-Methode).
Einfach nur zuweisen und casten klappt nicht. Du musst es irgendwo explizit anlegen.

Gruß,
Gogs

Hm,

dann muss ich wohl irgendwie einen Container um die Klasse bauen. Ist ja übel.

Nochmal zum eigentlichen Problem:
Ich habe einen fremde Klasse, die mir ein Array von Objekten liefert. Diese Objekte möchte ich in einer JComboBox anzeigen. Damit dort ein sinnvoller Text erscheint müsste ich die toString-Methode dieser Objekte überschreiben.
Wenn das nicht geht, muß ich mir wohl eine Containerklasse bauen, die wiederum eines dieser Objekte beinhaltet und den gewünschten String liefert.

Gibt es da keine schlauere Möglichkeit?

Gruß
Jochen

Ja, wenn du nicht derjenige bist, der die Objekte anlegt, werden sie immer als ClassA-Objekte angelegt und du musst mit denen arbeiten.

Am besten implementierst du in einem ListCellRenderer die Zuordnung „Anzeige eines ClassA-Objekts ClassA-Objekt“ und setzt der JComboBox den ListCellRenderer.

Das mit der toString-Methode könnte evtl. auch funktionieren:
Wenn du den Inhalt der ClassA-Objekte in (von dir selbst angelegte) ClassB-Objekte kopierst und mit einem Array von ClassB-Objekten weiterarbeitest.

Gruß, Gogs

Hallo, du kannst fremde Klassen nicht einfach so überschreiben. Das ist ja das schöne und sichere an Java. Ein ClassA Objekt bleibt ein ClassA Objekt (die Bezeichnung ist grauenhaft).

Nur der Autor einer Klasse oder jemand der Implementierungsdetails dieser Klasse kennt, sollte ein Subclass erstellen.

Eine Lösung habe ich aber: Du schreibst eine Methode, der du dein Objekt übergibst und die ein String zurückliefert. Diese Methode erstellt den String dann Anhand der Objekteigenschaften (öffentliche Objektvariablen z.B. und getter-Methoden).

Wie man eine JComboBox benutzt findest du hier: http://java.sun.com/docs/books/tutorial/uiswing/comp…

„This combo box contains an array of strings, but you could just as easily use icons instead. To put anything else into a combo box or to customize how the items in a combo box look, you need to write a custom renderer. An editable combo box would also need a custom editor. Refer to Providing a Custom Renderer for information and an example.“

Also entweder du benutzt Strings, oder du schreibst einen eigenen Renderer.

Gruß

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]