# Probleme mit Form.isShown



## a_l_e_x (26. Nov 2010)

Hallo, ih hab hier nen kleines Problem welches ich nicht gelößt bekomme.

Hab nen Midlet mit mehrern Form Objecten. (Alles mit Netbeans erzeugt.)

ich kann sie so auch mit switchDisplayable(null, getFormX); ohne Probleme nacheinander wechseln.

Frage ich dann aber mittels einer if Schleife
formX.isShown() ab, kommt immer false obwohl das Richtige Object angezeigt wird.

Hab dann mal rumgetestet und folgendes festgestellt,
wenn ich die nach der reihe nach anzeige bringt mir isShown() immer nur true von dem Object was angezeigt wurde bevor ich das Displayable gewechselt habe. also immer 1 zu spät.

was mache ich falsch.

Dann noch folgendes 
in einer Methode wird erst ein Form angezeigt und währendessen ein Gauge mit einer for schleife gefüllt.
beim ersten aufruf  funktionierts ordnungsgemäß
beim zweiten aufruf jedoch wird das Form Object erst nach dem ablauf der Schleife eingeblendet .

Woran könnte das liegen?

finde keine Methode die die Aneige evtl. vor der Schleife aktualisert (wie repaint() oder so.)


Danke euch schon mal im Vorraus
CLDC 1.1
MIDP 2.1


----------



## The_S (29. Nov 2010)

a_l_e_x hat gesagt.:


> ich kann sie so auch mit switchDisplayable(null, getFormX); ohne Probleme nacheinander wechseln.



kA, kenne den GUI-Builder von NetBeans und diese Methode nicht.



a_l_e_x hat gesagt.:


> Frage ich dann aber mittels einer if Schleife



if-schleife.de



a_l_e_x hat gesagt.:


> Hab dann mal rumgetestet und folgendes festgestellt,
> wenn ich die nach der reihe nach anzeige bringt mir isShown() immer nur true von dem Object was angezeigt wurde bevor ich das Displayable gewechselt habe. also immer 1 zu spät.
> 
> was mache ich falsch.



Wenn ich das richtig in Erinnerung habe, dann wird das Displayable asynchron gesetzt. Das gesetzte Displayable wird also noch nicht angezeigt, während dein Code schon weiter läuft.



a_l_e_x hat gesagt.:


> Dann noch folgendes
> in einer Methode wird erst ein Form angezeigt und währendessen ein Gauge mit einer for schleife gefüllt.
> beim ersten aufruf  funktionierts ordnungsgemäß
> beim zweiten aufruf jedoch wird das Form Object erst nach dem ablauf der Schleife eingeblendet .
> ...



Kann viele Gründe haben. Ohne Code schwer zu sagen.


----------



## a_l_e_x (29. Nov 2010)

Danke schon mal für deine Antwort und Sorry klar if Abfrage. leuchtet mit ein.

also die generierte Methode sieht so aus.

```
public void switchDisplayable(Alert alert, Displayable nextDisplayable) {
        // write pre-switch user code here
        Display display = getDisplay();
        if (alert == null) {
            display.setCurrent(nextDisplayable);
        } else {
            display.setCurrent(alert, nextDisplayable);
        }

public Form getFormX() {
        if (formX == null) {
            // write pre-init user code here
            formX = new Form("Title", new Item[] { getImageItem(), getGauge() });
            // write post-init user code here
        }
        return formX;
    }
```

denke das meine Probleme zusammenhängen, habe auch die Documentation der Klasse Display gelesen , wo dies auch erwähnt wird das es sa wohl ne verzögerung gibt.

Gibt es ne Möglichkeit zu warten bis das passende Form wirklich angezeigt wird bzw. isShown() true gibt ? und dann erst weiter läuft ?

hatte auch überlegt nach dem ersten anzeigen des Forms dies wieder zu löschen um es dann weider neu zu erstellen (da der erste aufruf ja funktioniert)
evtl. mit

```
if (formX != null)
	{       
	    formX = null;
    }
```
gibt aber ne java.lang.IllegalStateException

Dankeschon mal.


----------



## The_S (29. Nov 2010)

Einfach


```
while (!form.isShown()) {
  try {
    Thread.sleep(50);
  } catch (InterruptedException ie) {
    ie.printStackTrace();
  }
}
```


----------



## a_l_e_x (29. Nov 2010)

danke werds nachhermal probiern und dann hier bescheid geben.


----------



## a_l_e_x (29. Nov 2010)

funktioniert leider auch nicht, da form.isShown() immer erst true gibt für ein Object wenn das nächste bereits angezeigt wird.
auch Display.getCurrent() gibt immer das Object zurück welches 1 vorher angezeigt wurde und nicht das was gerade mit setCurrent() gesetzt wurde.
auch eine wartezeit bringt nix.
die while schleife lief ewig weiter.

Schade aber werde mir wohl was anderes überlegen müssen.zb. ein weiteres Form Object.

Aber Danke dir für die Mühe


----------



## The_S (30. Nov 2010)

Warum funktioniert das nicht? Du wolltest doch so lange werte, bis form.isShown true zurückliefert. Genau das macht meine Schleife (inkl. Wartezeit um das Handy nicht zu überlasten).


----------



## a_l_e_x (30. Nov 2010)

ja dachte auch das es funktionieren müsste.

Aber isShown liefert nie für das angezeigte Form true ! keinen plan wieso.

Bsp.
Midtlet startet
Form1 aktiv
-        form1.isShown()  gibt false

Form1 nicht aktiv
Form2 aktiv
-          form1.isShown()  gibt true
-                         form2.isShown()  gibt false

Form1 nicht aktiv
Form2 nicht aktiv        
Form3 aktiv
-           form1.isShown()  gibt false   
-                           form2.isShown()  gibt true
-                           form3.isShown()  gibt false

also immer eins versetzt.
Denke das dies erst geändert wird wenn das form ne weile sichtbar ist und das Programm sonst nix macht.
Aber die Schleife mit Thread.sleep dies dann verhindert.


----------



## The_S (30. Nov 2010)

Naja, in nem separaten Thread muss das natürlich schon laufen.


----------



## a_l_e_x (30. Nov 2010)

danke für den tip, hab zwar noch nie gemacht werds aber nachher mal versuchen.


----------

