Kommunikation zwischen 2 TopComponents eines Modules

Alles zu NetBeans als RCP-Platform

Moderator: wegus

Antworten
UweK

Kommunikation zwischen 2 TopComponents eines Modules

Beitrag von UweK » 17.04.2007, 16:14

Hallo zusammen,

ich bin mal wieder auf ein Problem gestoßen, bei dem ich einfach nicht weiterkomme.
Ich habe ein Modul mit mehreren TopComponents. In meinem Fall ist auf der linken Seite ein Fenster, in dem Suchkriterien eingegeben werden. Wenn auf Suche geklickt wird, sollen Werte an das Result-Fenster (ein anderes TopComponent-Fenster) übergeben werden.
Meine Probleme:
1) Wie rufe ich Methoden des anderen Fensters auf?
2) Wie stelle ich sicher, dass das Resultfenster auch geöffnet ist?

Wenn ich auf dem Holzweg bin, könnt ihr mir das gerne sagen. Mein Ziel ist es zwei Fenster zu haben. Eines für die Suchparameter und eines für die Ergebnisse.


Uwe

Benutzeravatar
recJake
Beiträge: 669
Registriert: 19.07.2006, 11:50
Wohnort: IDEs

Beitrag von recJake » 17.04.2007, 16:30

Hi,

wenn es eine echte TopComponent ist, dann gibt es zwei statische Methoden:
public static synchronized YourComponent findInstance() {
// ... immer zu präferieren :)
}

// und

public static synchronized YourComponent getDefault() {
// ... diese Methode nicht aufrufen :(
}
Damit bekommst Du, wenn die Klasse registriert ist, ganz sicher Dein Fenster. Dem ganzen liegt zugrunde, daß es immer nur eine TopComponent geben kann. Man bekommst also immer die eine singleton-Instanz.

Achtung:
Die zweite Methode sollte nicht direkt aufgerufen werden (das macht die Erste), weil man die TC sonst an der Registrierung in der Plattform "vorbeischummelt". :(
J..e
Willst Du coden, so code. Willst Du nutzen, so nutze. Willst Du beides, lass es!

UweK

Beitrag von UweK » 17.04.2007, 17:01

Danke für die schnelle Antwort.

Ich hab das Ganze grad mal probiert.
Dazu habe ich ein SearchTopComponent und ein SearchResultTopComponent erstellt. Im SearchTopComponent ist ein Button, der beim Klick folgendes ausführt:

Code: Alles auswählen

SearchResultTopComponent.findInstance();
Um das Ganze zu testen habe ich das Resultfenster geschlossen und dann auf dem Button gedrückt. Das Result-Fenster erscheint jedoch nicht. Auch

Code: Alles auswählen

SearchResultTopComponent.findInstance().setVisible(true);
läuft ins Leere.

Ideen dazu?

Thanks

Uwe

Benutzeravatar
stophi
Beiträge: 150
Registriert: 02.03.2007, 07:32
Wohnort: München
Kontaktdaten:

Beitrag von stophi » 17.04.2007, 17:18

Probier's vielleicht mal so in der Art:

Code: Alles auswählen

TopComponent win = SearchResultTopComponent.findInstance();
win.open();
win.requestActive();

Benutzeravatar
csc
Beiträge: 172
Registriert: 05.12.2006, 12:06
Wohnort: Bremen/Göttingen
Kontaktdaten:

Beitrag von csc » 17.04.2007, 20:23

Eine andere Methoden wäre die Verwendung von Lookups.
Dieses Tutorial könnte dir weiter helfen. http://platform.netbeans.org/tutorials/ ... ion-1.html

UweK

Beitrag von UweK » 18.04.2007, 07:27

Vielen Dank für die tolle Hilfe.
Funktioniert wunderbar.

Uwe

UweK

Beitrag von UweK » 27.04.2007, 08:50

Die Lösung von Stophi hat bisher immer super funktioniert.
stophi hat geschrieben:Probier's vielleicht mal so in der Art:

Code: Alles auswählen

TopComponent win = SearchResultTopComponent.findInstance();
win.open();
win.requestActive();
Nun habe ich allerdings noch ein Problem damit. SearchResultTopComponent lässt sich auf diese Art nur aus dem gleichen Package aufrufen. Was mach ich aber, wenn ich bestimmte öffentliche Methoden aus einem anderen Package heraus nutzen will. Muss ich dann alles nochmal in einer anderen Klasse, z.B. SearchResultAction public machen?

Benutzeravatar
stophi
Beiträge: 150
Registriert: 02.03.2007, 07:32
Wohnort: München
Kontaktdaten:

Beitrag von stophi » 27.04.2007, 09:51

Ich hab das auch noch nicht gemacht, aber ich glaube, das geht ungefähr so:

Mach mal rechtsklick->properties auf das Provider-Modul und unter API-Versioning musst du dann das Package als public deklarieren, das anderen Modulen zugänglich sein soll.
Bei dem Client-Modul musst du in den Projekt-Properties dann eine Abhängigkeit zu dem anderen Modul hinzufügen.

Edit: Upps, ich sollte mal erst richtig lesen, bevor ich schreibe. :shock:
Sorry. Ich finde, es war eine schöne Antwort, aber leider nicht die Antwort auf deine Frage. ;)

Ne, also warum funktioniert es denn nicht?
Hab gerade gedacht, dass open() protected wäre, aber alle benutzten Methdoen sind public, dann sollte das doch funktionieren, oder?

UweK

Beitrag von UweK » 27.04.2007, 10:49

Ich habe auch nicht erwartet, dass ich an dieser Stelle Probleme bekomme.
Ich habe gerade mal mit anderen TopComponents getestet. Das Verhalten ist überall gleich. Im gleichen Package gibt es keine Probleme, im anderen schon.

Benutzeravatar
stophi
Beiträge: 150
Registriert: 02.03.2007, 07:32
Wohnort: München
Kontaktdaten:

Beitrag von stophi » 27.04.2007, 13:01

*gnarf* ich wollte es eben nachstellen und ich kann mir denken, wo das Problem ist. Ist deine Klasse auch "public"?
also

Code: Alles auswählen

public final class SearchResultTopComponent extends TopComponent {
  // ...
}
Das Template zum Generieren von TopComponents macht die Klasse standardmäßig nur im Paket sichtbar.

Wenn es das nicht war, kannst du ja mal das Problem genauer beschreiben.

UweK

Beitrag von UweK » 27.04.2007, 13:19

Das war das Problem. Manchmal sieht man den Wald vor lauter Bäumen nicht. Da hätte ich auch selbst drauf kommen können.
Vielen Dank

Antworten