# Displayable wechseln. Mal gehts, mal nicht.



## Guest (9. Jul 2008)

Hallo.

Ich habe folgenden Code:


```
private void browseDir(String dirName){
		Enumeration en;
		FileConnection currDir = null;
		List browser;
		try{
			browser = new List(dirName, List.IMPLICIT);
			if (currDirName.equals(ROOT)){
				en = FileSystemRegistry.listRoots();
				canWrite = false; //in ROOT nicht schreiben
			}else{
				currDir = (FileConnection)Connector.open(PREFIX + dirName);
				en = currDir.list();
				canWrite = currDir.canWrite(); //testen, ob beschreibbar
				currDir.close();
				browser.append("..",null);//erstes Element
			}
			while (en.hasMoreElements()) {
				String fileName = (String)en.nextElement();
				// nur Verzeichnisse auflisten!
				if (fileName.charAt(fileName.length() - 1) == SEPARATOR) browser.append(fileName, null);
			}
			browser.setSelectCommand(enter);
			if(canWrite){
				browser.addCommand(choose);
			}
			browser.setCommandListener(this);
			Display.getDisplay(daddy).setCurrent(browser);
		}catch(SecurityException se){
			se.printStackTrace();
			Display.getDisplay(daddy).setCurrent(new ExitForm(daddy,"Bitte stellen Sie sicher, dass...blabla")); //<-
			showError("Verzeichnis konnte nicht geöffnet werden.");
		}
		catch(Exception e){
			e.printStackTrace();
			}
	}//browseDir()
```

Es handelt sich um die Methode meines Verzeichnisbrowsers, die eine List mit den Verzeichnissen/Roots des Dateisystems anzeigt. Mein Handy (SE W300) und der Emulator fragen bei jedem Aufruf einer Zugriffsmethode (Connector.open() etc.) um erlaubnis. Wird die vom Benutzer abgelehnt schmeißen diese Methode eine SecurityException. Die fange ich ab und wechsele zu einem Form (new ExitForm(...)) und zeige noch einen Alert an (meine showError(...)-Methode). daddy ist das Erzeuger-MIDlet meines Verzeichnisbrowsers, habe ich beim Erzeugen übergeben.

browseDir(ROOT) wird zunächst automatisch aufgerufen (eigener Thread). Der Benutzer sieht die Rootliste oder, wenn er die Rechteabfrage verneint erscheint ein Alert und danach mein ExitForm. Bis hierhin alles ok. Danach wird die Methode über das command "enter" aufgerufen. Ab da geht es schief: Verneint der User die Rechteabfrage bei diesem 2. oder  einem weiteren Durchlauf, also wenn er schonmal eine List (eben die mit den Roots) gesehen hat, dann kann ich nicht zum ExitForm wechseln. Stattdessen fällt er nach dem Alert auf die List mit den Roots zurück.

Zusammenfassend: Ich fange die SecurityException erfolgreich ab, denn das Alert wird gezeigt (showError()). Aber die Display.setCurrent(new ExitForm(...)) scheint überhaupt keine Wirkung zu haben, wenn die Methode zuvor schon einmal ohne Exception-Behandlung durchgelaufen ist. Auch wirft sie selbst keine Exception - das habe ich gecheckt.

Kann das jemand erklären?


----------



## ajva (9. Jul 2008)

So. Ich hatte eben vergessen mich anzumelden. Ich bin der Starter des Threads und habe das Problem jetzt mal in klein nachgebaut und etwas lokalisiert. Will sagen: vergesst den ersten Beitrag mit dem Problemcodeschnipsel und schaut euch mal das hier an:


```
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;

public class DisplayTest extends MIDlet implements CommandListener{

	protected void startApp(){
		setNewEF();	
	}
	protected void destroyApp(boolean unconditional){}
   	protected void pauseApp(){}

	public void commandAction(Command c, Displayable d){
		setNewEF();
	}
	void setNewEF(){
		EinForm EF = new EinForm();
		EF.setCommandListener(this);
		Display.getDisplay(this).setCurrent(EF);
		Display.getDisplay(this).setCurrent(new Alert("Ein Alert","ohne Sinn",null,AlertType.INFO));//<- Problemzeile
	}
}


class EinForm extends Form{

	private final Command cmd = new Command("doit", Command.OK, 1);
	
	EinForm(){
		super("EinForm");
		this.addCommand(cmd);
		this.append(this.toString());
	}
}
```

Die Funktion des Programms ist so einfach wie sinnlos, das Problem ist aber das gleiche. Ein "EinForm" wird angezeigt, es enthält (sich selbst).toString() um es identifizieren zu können und ein Command namens cmd mit der Beschriftung "doit". Auf Tastendruck soll 

1. ein neues "EinForm" angezeigt werden und 
2. ein Alert angezeigt werden.

Dazu ersetze ich zunächst das alte EinForm mit dem neuen (Zeile 18) und zeige dann das Alert. Das Alert verschwindet nach einigen Sekunden und zum Vorschein kommt: das alte!? Warum ist das so? Wenn ich die Sache mit dem Alert weglasse (Zeile auskommentieren), dann geht es.


----------



## helplesstom (27. Jul 2009)

hiho,

 versuch mal:


```
void setNewEF(){
		EinForm EF = new EinForm();
		EF.setCommandListener(this);
		Display.getDisplay(this).setCurrent(EF);
		Display.getDisplay(this).setCurrent(new Alert("Ein Alert","ohne Sinn",null,AlertType.INFO), EF); //<-- Problemzeile
	}
```

gruß helplessTom


----------

