BeanDev: GUI Beans, Container Beans mit Komponenten
In einem mehrteiligen Tutorial habe ich beschrieben, wie man mit GUI Beans im GUI Builder umgeht. Eine Spezialität ist aber offen geblieben. Wie kann man GUI Container in den GUI Builder verwenden und zugleich schon Komponenten vorgeben?
Generell ist es erstmal nur möglich Container als GUI Elemente zu verwenden, wenn diese keine Komponenten enthalten. Also ein leeres JPanel. Diese Container müssen auch zwingend java.awtContainer als Super-Klasse haben und die letzte Einschränkung: der LayoutManager des Beans muss vom GUI Builder verstanden werden.
Wenn diese Voraussetzungen erfüllt sind, kann man das Bean direkt per Drag and Drop in den GUI-Builder ziehen und dann auch sofort Komponenten einfügen.
Aber gerade bei GUI Beans will man schon Komponenten in das Bean einfügen. Das darf man auch, allerdings muss dann das Bean im GUI Builder "so-wie-es-ist" verwenden. Man darf dem Bean selber keine Komponenten mehr hinzufügen.
Was also tun, wenn man dem Bean-Anwender doch die Möglichkeit geben möchte, Komponenten hinzufügen zu dürfen. Beispiele gibt es genug. Vielleicht könnte es ein File-Dialog Bean sein, dem der Entwickler später eine Vorschauansicht mitgeben möchte.
Wenn man solche Beans realisieren möchte, kommt man (leider) um die BeanInfo Klasse nicht herum. Man muss nämlich auf dem Bean eine freien Platz reservieren, in dem der spätere Anwender seine Komponenten hinzufügen darf.
Diesen freien Platz muss man in der BeanInfo Klasse bekannt machen. Aber erstmal zum ersten Schritt. Einfach mal ein JPanel-GUI mit der NetBeans IDE erzeugen. Dort packe ich ein Label und ein Textfeld rein. Diese beiden Komponenten sollen immer von diesem Bean vorgegeben sein:
Den Container (das Delegate Panel) habe ich grün eingefärbt, damit man ihn in diesem Tutorial besser sehen kann. Es ist ein einfaches JPanel mit beliebigen Namen. In diesem Fall ist es der Name innerPane.
Das Bean benötigt nun eine Methode, die das JPanel als Container bekannt gibt. Auch dieser Name der Methode ist gleichgültig. Aber getInnerPane bietet sich an:
Aber damit kann der GUI Builder noch nichts anfangen. Wenn wir das Bean (im compilierten Zustand) so per Drag and Drop in den GUI Builder ziehen würden, könnte man dem Bean keine Komponente hinzufügen.
Nun der Trick. Auf das Bean die rechte Maustaste und eine BeanInfo-Klasse erzeugen lassen. Der Quelltext wird folgendermaßen ergänzt:
Es muss also nur der Wert containerDelegate gesetzt werden: Mit dem Methodennamen aus unserem Bean.
Nun kann man das Bean (neu compiliert und eingefügt) als Container für Komponenten nutzen. Wenn man den grünen Platzhalter nicht sofort sieht, einfach trotzdem eine Komponente von der Palette auf das Bean ziehen. Die Komponente wird dann an der passenden Stelle eingefügt. Ggf. wurde nämlich vom LayoutManager der Bereich einfach auf 0 * 0 Pixel zusammen geschrumpft.
Hier das Ergebnis:
Bleibt nur noch zu sagen, dass in diesem Fall das Delegate die Einschränkungen geerbt hat: Es dürfen keine vorgegebenen Komponenten im Panel liegen und ein bekannter LayoutManager des GUI-Builders muss genutzt werden.
Beste Grüße,
Josch.
Da werden Sie geholfen:
Das deutsche NetBeans Forum
![Validate my RSS feed [Valid RSS]](http://www.sepix.de/fileadmin/valid-rss.png)