Tela Congelando

3 respostas
Jedi_FeniX

Quando tento mudar de uma tela para outra ela simplesmente congela.
Tenho uma tela com imagem carregada, quando clico em um determinado botão para mudar para outra tela e carregar uma outra imagem a aplicação simplesmente para não tem nenhum erro.
Eu acho que o problema pode estar nesta parte do código:

this.append(Image.createImage(image, 0, image.length));
        this.setCommandListener(this);
        Display display = Display.getDisplay(this.midlet);
        display.setCurrent(null);
        display.setCurrent(this);
synchronized(this.midlet) {
            try {
                System.out.println("WAIT...");
                this.midlet.wait();
                System.out.println("FREEDOM");
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }

O que está errado?

3 Respostas

Vinci

Não consegui ver o erro por essa parte do código descrita acima .

Sua MIDLET está implementando CommandListener certo??

se sim, então ela tem o metodo commandAction(Command c, Displayable d)

para fazer a transição de tela gealmente eu faço assim:

import javax.microedition.midlet.;
import javax.microedition.lcdui.
;

/**

  • @author rvinci
    */
    public class TestMidlet extends MIDlet implements CommandListener {

    private class MainMenu extends List {
    
    public MainMenu() {
    
    super(Title, List.IMPLICIT);
    
    append(um, null);
    
    append(Two, null);
    
    append(Three, null);
    
    append(Four, null);
    
    addCommand(exitCommand);
    
    }
    
    }
    

    private class SubMenu extends List {

    public SubMenu() {
         super("Sub Menu", List.IMPLICIT);
         append("Apple", null);
         append("Pear", null);
         append("Banana", null);
         addCommand(backCommand);
     }
    
    }
    
    private Display display;
    
    private MainMenu mainMenu = new MainMenu();
    
    private SubMenu subMenu = new SubMenu();
    
    public static final Command exitCommand =
    
    new Command(Exit, Command.EXIT, 1);
    
    public static final Command backCommand =
    
    new Command(Back, Command.BACK, 1);
    

    public TestMidlet() {
    }

    protected void destroyApp(boolean unconditional)
    
    throws MIDletStateChangeException {
    
    exitMIDlet();
    
    }
    
    public void exitMIDlet() {
    
    notifyDestroyed();
    
    }
    
    public Display getDisplay() {
    
    return display;
    
    }
    
    protected void initMIDlet() {
    
    mainMenu.setCommandListener(this);
    
    subMenu.setCommandListener(this);
    
    getDisplay().setCurrent(mainMenu);
    

    }

    protected void pauseApp() {
    }

    protected void startApp()
    
    throws MIDletStateChangeException {
    
    if (display == null) {
    
    display = Display.getDisplay(this);
    
    initMIDlet();
    
    }
    

    }

    public void commandAction(Command c, Displayable d) {
    
    if (d == mainMenu & c == exitCommand) {
    
    exitMIDlet();
    
    } else if (d == mainMenu & c == List.SELECT_COMMAND) {
    
    int item = mainMenu.getSelectedIndex();
    
    switch (item) {
             case 0:
                 getDisplay().setCurrent(subMenu);
                 System.out.println("Selecionou o primeiro");
                 break;
             case 1:
                 getDisplay().setCurrent(subMenu);
                 System.out.println("Selecionou o segundo");
                 break;
             case 2:
                 getDisplay().setCurrent(subMenu);
                 System.out.println("Selecionou o terceiro");
                 break;
             case 3:
                 getDisplay().setCurrent(subMenu);
                 System.out.println("Selecionou o quarto");
                 break;
         }
     } else if(d == subMenu & c == backCommand){
       display.setCurrent(mainMenu);
     }else if (d == subMenu & c == List.SELECT_COMMAND) {
         int item = subMenu.getSelectedIndex();
         switch (item) {
    
         case 0:
         display.setCurrent(mainMenu);
         System.out.println("Selecionou o primeiro do submenu");
         break;
    
         case 1:
         display.setCurrent(mainMenu);
         System.out.println("Selecionou o segundo do submenu");
         break;
    
         case 2:
         display.setCurrent(mainMenu);
         System.out.println("Selecionou o terceiro do submenu");
         break;
         }
     }
    

    }
    }

esse é um exemplo de transição de tela com um list, tenta implentar no seu projeto

pelo que eu entendi é isso que você está procurando

espero ter ajudado

Abraços

Jedi_FeniX

Eu acredito que o erro está nesta parte:

synchronized (this.midlet) {
            try {
                System.out.println("WAIT...");
                this.midlet.wait();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }

Parece que quando o setCurrent de Display é “setado” a tela não muda imediatamente, parece que tem um delay, pelo o que eu entendi, pode ser que esteja errado…
O problema que eu tenho que parar a aplicaçõa nesta tela e depois continuar quando um comando for disparado, como eu posso parar a aplicação e exibir uma determinada tela?

Jedi_FeniX

Vou colocar mais uma dúvida em relação ao wait.

Tenho uma classe MIDlet que no método startApp está assim:

public void startApp() {

   form = new Form("Image");
   form.append(image);
   Display.getDisplay(this).setCurrent(form);
   synchronized(this) {
            try {
                this.wait();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
}

E no método destroyApp está igual, sendo que no destroyApp a "tela nova" não aparece e no startApp a tela aparece, alguém saberia por que?

public void destroyApp() {

   form = new Form("Image");
   form.append(image);
   Display.getDisplay(this).setCurrent(form);
   synchronized(this) {
            try {
                this.wait();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
}
Criado 8 de junho de 2009
Ultima resposta 15 de jun. de 2009
Respostas 3
Participantes 2