# GWT Widgets aus Klassen heraus ansprechen...



## farsight (30. Sep 2011)

Hiho,
habe folgendes Problem:
Ich bastle gerade an einer GWT Anwendung deren Hauptteil ein TabPanel mit mehreren Tabs ist.
Da der Code für die einzelnen Tabs ziemlich umfangreich ist, würde ich gerne für jedes Tab eine eigene Klasse (oder zumindest eine eigene Datei) mit dem ganzen Code (angefangen vom zusammenbasteln der Panels bis hin zum Abhandeln der OnKlicks usw...) anlegen um das ganze übersichtlicher zu halten.

Ist das irgendwie möglich? Wenn ich eine neue klasse im selben Package erstelle hab ich keinen Zugriff auf die Widgets.


----------



## farsight (30. Sep 2011)

also falls jemand das gleich problem hat:

erstellt eine klasse (zB AdminPanel) die ein xyzPanel erbt:

```
public class AdminPanel extends VerticalPanel {
```
Die Widgets werden wie üblich im deklarationsteil der Klasse definiert und initialisiert und im constructor hinzugefügt:

```
this.add(button); //<= wurde im deklarationsteil erstellt
```
im constructor kommen auch ALLE handler rein. (ich rufe in jedem handler eine eigene private methode auf)
im onModuleLoad vom entrypoint file kommt dann einfach nur rein:

```
Widget adminPanel = new AdminPanel();
mainTab.add(adminPanel, "Adminbereich"); //mainTab ist ein TabPanel in diesem Beispiel
```

man kann natürlich auch gleich ein VerticalPanel statt dem Widget nehmen, nur so ist man flexibler finde ich.

[edit] habe gerade festgestellt dass man im constructor super(); mit aufrufen sollte da sonst z.b. bei einer DialogBox die .center und .hide methoden nicht funktionieren....[/edit]


----------



## darekkay (30. Sep 2011)

farsight hat gesagt.:


> man kann natürlich auch gleich ein VerticalPanel statt dem Widget nehmen, nur so ist man flexibler finde ich.



Nicht wirklich, da Widget die Oberklasse von VerticalPanel ist, und dein AdminPanel nochmal von VerticalPanel erbt. Wenn du schon eine eigene Ableitung schreibst, solltest du sie so benutzen:

```
AdminPanel adminPanel = new AdminPanel();
```

So, wie du es benutzt, machst du es nicht flexibler - ganz im Gegenteil. Versuche die VerticalPanel-Methode "setHorizontalAlignment" aufzurufen - es wird nicht klappen.
Solltest du in deiner AdminPanel-Klasse eigene Methoden schreiben oder die der Oberklasse überschreiben, so würdest du auch auf die nicht zugreifen können.

Um es mal abstrakt zu beschreiben (mir hilft sowas):


```
Tier tier = new Vogel(); // wobei Vogel eine Unterklasse von Tier ist
```

Glaubst du, dass tier "fliegen" kann?


----------



## farsight (30. Sep 2011)

naja sinn der sache ist eigentlich dass von aussen NICHT auf die klassen zugegriffen wird - sie werden nur erstellt und arbeiten dann für sich abgekapselt..

aber du hast schon recht - nur über die vererbung in java könnte man ja eine doktorarbeit schreiben 

habs grad nach deiner beschreibung probiert und festgestellt dass man dann bei der DialogBox das super(); weglassen kann damit man sie mit .center  anzeigen kann


----------



## darekkay (30. Sep 2011)

farsight hat gesagt.:


> naja sinn der sache ist eigentlich dass von aussen NICHT auf die klassen zugegriffen wird - sie werden nur erstellt und arbeiten dann für sich abgekapselt..



Und warum ist das unbedingt notwendig? Ich nehme an, du hast gar keine eigenen (public-) Methoden in deiner AdminPanel-Klasse und möchtest bloß alle Widgets/Events initialisieren? Dann kannst du tatsächlich

```
VerticalPanel adminPanel = new AdminPanel()
```
nutzen. Damit wird weiter mit einem VerticalPanel gearbeitet, der alle Eigenschaften, die im AdminPanel definiert wurden (und natürlich auch im VerticalPanel vorhanden sind), besitzt. In dem Fall solltest du aber über das Factory-Pattern nachdenken 

Ich habe bsp. für das GWT-FormPanel eine FormComponentFactory geschrieben, die mir die verschiedenen Komponenten mit gewünschten Eigenschaften erzeugt - sehr praktisch, wenn man viele gleichartige Objekte an mehreren Stellen benötigt.


----------

