[Erledigt] Objekt-Typ zur Laufzeit festlegen und instanziieren

Ich habe ein JPanel, auf welchem ich zur Laufzeit entweder JButton oder JToggleButton unterbringen will.
Das Ganze soll halbwegs konfigurierbar geschehen. Vorgestellt habe ich mir, dass ich dem Konstruktor des Panels den Typ des Buttons bspw. als Class übergebe und eine private Methode intern das passende Button-Objekt erzeugt.
Weiß jemand, wie man das macht? Oder hat jemand eine bessere Idee?

Naja bei den beiden Buttons könnteste ihm einfach sagen das er einen AbstractButton erwartet und ihm dann ein Objekt mitgeben was er darstellen soll.
Oder du gibst ihm einen Wert/Boolean mit anhand desssen er das passende Objekt erzeugt, nur sehe ich da das Problem das du garnichts dran einstellen kannst.

Weil ich zu keinem vernünftigen Resultat komme, überlege ich jetzt, das über Vererbung zu lösen. Eine Basisklasse eines spezialisierten Paneltyps, von der zwei Klassen erben. Eine kann dann JToogleButton, die andere JButton erzeugen und hinzufügen.
Ein gemischtes Panel brauche ich erst mal nicht. Aber was, wenn ich das irgendwann doch mal brauche?

Ich versteh zwar nicht genau was du meinst/willst, aber:

Vorgestellt habe ich mir, dass ich dem Konstruktor des Panels den Typ des Buttons bspw. als Class übergebe und eine private Methode intern das passende Button-Objekt erzeugt.
Weiß jemand, wie man das macht?


if (cls.getCanonicalName().equals("javax.swing.JButton") {
  JButton butt = (JButton)cls.newInstance();
}
else if (cls.getCanonicalName().equals("javax.swing.JToggleButton") {
  JToggleButton butt = (JToggleButton)cls.newInstance();
}```

(Das ganze jetzt frei ausm Kopp und ohne Compiler).

So ähnlich hab ich auch schon probiert, aber das geht nicht, weil du mit Generics festlegst, dass nur AbstractButton übergeben werden dürfen.
Es gibt aber auch mit Generics die Möglichkeit erbende Klassen mit einzuschließen.
Hab das schon mal gesehen, muss ich mal suchen.

Mehr Java-Blog-Buch lesen :wink:

http://www.java-blog-buch.de/0603-wildcards-und-bounded-type-parameters/

OK, mit public MyPanel(Class<? extends AbstractButton> button) { ... }

gehts. Muss mal sehen, ob das auch praxistauglich ist.
Danke erstmal.

Joa, ich weiß aber immer noch nicht, warum nicht einfach ein AbstractButton genommen wird bzw. versteh das eigentliche Problem :confused: .

Aber freut mich, wenn ich dir zumindest ansatzweise helfen konnte :slight_smile: .

btw: Im Chrome sind die Code-Tags ein bisschen zerstört:

Weil ich zur Laufzeit noch nicht weiß, welcher Button-Typ zum Einsatz kommt.
Wäre die Lösung dafür ne blöde Idee?

Achso, ich glaube jetzt habe ich das Problem verstanden. Ich fasse mal mit meinen Worten zusammen:

Du hast ein JPanel, welches zur Laufzeit ein gewisser Parameter übergeben werden soll. Anhand diesen Parameters möchtest du entweder einen (oder mehrere) JToggleButton oder einen JButton im JPanel erzeugen. Also der JButton bzw. der JToggleButton wird nicht von außen an das JPanel übergeben, sondern direkt im JPanel erzeugt.

Habe ich das so richtig verstanden? Falls ja, könntest du natürlich die Methode mit dem übergeben der Class-Klasse verwenden. Aber flexibler (und vor allem später leichter erweiterbar, falls evtl. noch eine andere Komponente hinzugefügt werden soll) wäre eine Abstrakte Fabrik. Falls du noch nicht mit dem Abstract-Factory-Pattern gearbeitet hast, kannst du dich z. B. hier => http://www.java-blog-buch.de/b-abstract-factory/ <= mal einlesen.

Du hast es erfasst.:slight_smile:

Ich gucks mir mal an. Danke.

Bei Unklarheiten kann ich heute Abend oder im lauf des Wochenendes auch noch gerne ein Beispiel bringen. Aber jetzt muss ich erstmal weg - meine Verabredung wartet :wink: .