Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Выход из приложения в Canvas


Автор: satellite1977 20.8.2007, 10:09
Привет всем. Как сделать выход из приложения в Canvas? Пытаюсь создать объект главного класса мидлета и использовать его метод destroyApp(), но выскакивает ошибка SecurityExeption - вроде и правильно, так как объект мидлета уже создан а я пытаюсь создать еще один. Тогда как же поступить? Спасибо за внимание )))

class Graf extends Canvas implements CommandListener
{
    public Command CExit;
    public Graf()
        {
            super();
            CExit = new Command("Выход", Command.EXIT, 1);
         }
public void paint(Graphics g)
{
    addCommand(CExit);
    setCommandListener(this);
}
public void commandAction(Command c, Displayable d)
{
    if (c == CExit)
        {
             ????
         }
}

Автор: SatanClaus 20.8.2007, 10:40
У тебя должен быть примерно такой мидлет
Код

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;

/**
 * Created by IntelliJ IDEA.
 * User: SatanClaus
 * Date: 20.08.2007
 * Time: 10:35:24
 * To change this template use File | Settings | File Templates.
 */
public class Main extends MIDlet {

    private static Main instance;
    private Graf canvas;

    public static Main getInstance(){
        if (instance == null) instance = new Main();
        return instance;
    }

    public void startApp(){
        instance = this;
        canvas = new Graf();
        Display.getDisplay(this).setCurrent(canvas);
    }
    public void pauseApp(){

    }
    public void destroyApp(boolean destroy){
        notifyDestroyed();
    }
}

Потом в обработке нажатия клавиши, в канвасе,
пишешь Main.getInstance().destroyApp(true); И все... Только в destroyApp(boolean destroy)
ты должен закрывать все потоки и все такое... А потом вызывать notifyDestroyed();

Автор: hamsterKSU 20.8.2007, 10:41
а о таких вещах как статические переменные или методы слыхал?
в классе мидлета делаешь статическую переменную на него самого и потом обращаешся к ней и вызываешь destroyApp()

Добавлено через 22 секунды
опередили smile

Автор: SatanClaus 20.8.2007, 10:43
 smile 

Автор: satellite1977 20.8.2007, 11:31
Спасибо большое. Когда-то я очень хорошо владел Бейсиком (во времена ZX SPECTRUM )))), сейчас пытаюсь овладеть ООП, дается нелегко, потому что привык к простому коду без всяких классов))).
Может у кого-то своими вопросами вызываю гнев, но вы уж извините )))

Отдельное спасибо SatanClaus, за то, что привел такой понятный ответ с примером.

Автор: W0LF 20.8.2007, 11:49
c WTK идет набор примеров
...:\WTK22\apps\
там нормально много чего описано

Автор: math64 23.8.2007, 16:19
Если сделать как было предложено и во время игры был звонок то после ответа на звонок и возврата к игре будет создан новый Canvas и игра начнётся сначала (хотя конечно смотря как он написан). Лучше Canvas создать в конструкторе, а startApp() только показывать. Указатель на Midlet можно передать в конструкторе Canvas, тогда его можно использовать в нескольких мидлетах:
Код

public class MyMidlet extends Midlet {
   MyCanvas canvas;
   public MyMidlet() {
      canvas = new MyCanvas(this);
   }
   public void startApp() {
      Display.getDisplay(this).setCurrent(canvas);
   }
}
public class MyCanvas extends Canvas implements CommandListener {
   private Command exit = new Command("Exit", Command.Exit, 1);
   private Midlet midlet;
   public MyCanvas(Midlet midlet) {
      this.midlet = midlet;
      addCommand(exit);
      setCommandListener(this);
   }
   public void commandAction(Command c, Displayable d) {
     if (c == exit) {
       midlet.destroyApp(true);
       midlet.notifyDestroyed();
       return;
     }
     ...
   }
   ...
}

Или можно перенести обработку exit в мидлет:
Код

public class MyMidlet extends Midlet implements CommandListener {
   private Command exit = new Command("Exit", Command.Exit, 1);
   private static Midlet midlet;
   MyCanvas canvas;
   public MyMidlet() {
      midlet = this;
      canvas = new MyCanvas(this);
      canvas.addCommand(exit);
      canvas.setCommandListener(this);
   }
   public void startApp() {
      Display.getDisplay(this).setCurrent(canvas);
   }
   public void commandAction(Command c, Displayable d) {
     if (c == exit) {
       destroyApp(true);
       notifyDestroyed();
       midlet = null;
     } else
       canvas.commandAction(c, d);
   }
}
public class MyCanvas extends Canvas implements CommandListener {
   public MyCanvas() {
   }
   public void commandAction(Command c, Displayable d) {
     ...
   }
   ...
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)