BeanDev: TopComponent und Paletten (wie ich sie zusammen brachte)
Seit sechs Monaten beschäftige ich mich damit, meine alten Projekte soweit umzubauen, dass diese relativ einfach in die NetBeans Plattform integriert werden können. Dieses Refactoring hat eigentlich nichts mit NB zu tun, es geht nur darum eine vernünftige Modularisierung zu erreichen.
In den letzten drei Monaten habe ich schon verstärkt neue Projekte ausschließlich auf der NetBeans 6.0 (und nun 6.1) Plattform implementiert. Immer wieder stoße ich dabei auf Probleme, bei denen mir kein Buch, kein Tutorial und kein Wiki helfen will oder kann.
Insbesondere die Tutorials, mit ihrem Anspruch sehr einfach aufgebaut sein zu wollen, schicken immer wieder auf den Irrweg und hinterlassen manchmal einen verstörten Programmierer mit verzweifeltem Gesichtsausdruck, ausgerauften Haaren und der letztendlichen Erkenntnis: So einfach ist das nun auch wieder nicht.
Dazu gehören auch Paletten und ihre (nahezu mystische) Fähigkeit, sich automatisch einzublenden, wenn man ein TopComponent-Fenster öffnet.
Jeder NB-Entwickler kennt die netten Helferlein, die z.B. beim Öffnen des Formeditors sich zusätzlich einblenden. So was wollte ich auch in meiner Anwendung haben. Es geht um eine Palette, die Funktionseinheiten für einen Query-Builder liefern soll. Die Palette hat mehrere Kategorien, aus denen ein Anwender unterschiedlichste Abfrage-Attribute zusammenklicken kann, die letztendlich nur vorprogrammierte SQL-Anweisungen sind.
Diese Abfrage-Attribute kann der Anwender in einem Query-Builder-Fenster (BeanTreeView in einem TopComponent mit ExplorerManger) nach gutdünken zusammenfügen. So weit so gut. Das Ergebnis der Klickorgie kann der geneigte Anwender dann in einem extra TopComponent-Fenster betrachten.
Folgende Aufteilung hatte ich mir vorgestellt. Der Query-Builder mit seinem BeanTreeView ist links angedockt. Die Palette dockt rechts an und spätestens bei der "Abfrage ausführen"-Aktion soll sich das Ergebnis-Fenster im Editor-Bereich öffnen und die ermittelten Datensätze anzeigen.
Wie man so etwas (größtenteils) deklarativ erledigt erklären vielfältige "Window"-Tutorials. Hier z.B. ein Tutorial.
Wie man eine Palette programmiert und wie diese automatisch zu einem TopComponent geöffnet wird, findet man in diesem Tutorial.
Nun ja, einfach zu verstehen, wenn man erstmal dahinter gestiegen ist, wie das mit dem Layer.xml und Lookup-Registrierungen funktioniert. Dann geht das tatsächlich leicht von der Hand.
... nur, dass es bei mir nicht funktioniert hat.
Jedes mal, wenn ich den Query-Builder geöffnet hatte, zeigte sich nicht die zugeordnete Palette. Nach stundenlangem Debuggen konnte ich auch definitiv ausschließen, dass mir versteckte Exceptions oder falsche Lookup-Registrierungen Steine in den Weg werfen. Es war einfach alles so programmiert, wie es die Autoren der Tutorials vorgemacht haben.
Nach einer Mütze voll Schlaf holte ich mir die Beispielprogramme von der netbeans.org Seite (die höhnisch lächelnd meine Inkompetenz deutlich machten in dem sie natürlich funktionierten) und verglich diese mit meinem Quelltext. Nur 10 Minuten (und durch einen glücklichen Zufall oder Eingebung?) später hatte ich einen kleinen Unterschied festgestellt. Die TopComponents der Beispiele, die eine Palette zum Anzeigen animieren sollen wurden immer im Mode "editor" deklariert. D.h. die TopComponents erschienen im Center-Bereich der Anwendung und wurden nicht an der linken Seite angedockt. Und das war das Problem.
Man merke sich folgendes:
Die automatische deklarative Aktivierung einer Palette zu einem TopComponent funktioniert nur dann, wenn das TopComponent in der Layer-Datei im Mode "editor" registriert wurde.
Danke. Das hätte man ja auch mal erwähnen können.
Da die Anwendung erstmal fertig werden musste, habe ich das Design ein wenig geändert und meinen Query-Builder tatsächlich im "editor"-Bereich angezeigt. Und nun klappte es auch mit der Nachbarin "Palette".
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)