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


Автор: John2 23.5.2012, 18:20
Суть такая:
Есть основной класс от MIDlet 
Код

public class MyMidlet extends MIDlet implements CommandListener {
public Form formMidlet;
private Display mydisplay;

}

В нём происходит обработка команд

 в другом классе наследуемом от Form 
Код

public class MyForm extends Form implements CommandListener {
/** команда выхода из формы MyForm программы в объект Form, созданный в основном классе мидлет */
    public Command backToApp;

public void commandAction(Command c, Displayable d) {
        if (c == backToApp)  {
                 // необходимо вернуться в  formMidlet определённый в основном классе мидлета
        }
}

Тоже  обрабатываются команды

Как видно со второго фрагмента кода необходимо вернуться в  formMidlet. Если я правильно понимаю, то необходимо каким-то образом передать ссылку на объект Displayable, используемый в основном классе мидлета. Как это сделать, ума не приложу.
И вообще трудно понять как между собой связаны в этом случае объекты Display, Displayable и CommandListener.
Может кто-то на примере разъяснит, буду очень благодарен.

Автор: Kalisnik 24.5.2012, 11:04
Цитата(John2 @  23.5.2012,  18:20 Найти цитируемый пост)
И вообще трудно понять как между собой связаны в этом случае объекты Display, Displayable и CommandListener.


Display - объект, который показывает другие объекты на дисплее.
Displayable - это "другие объекты", которые показывает объект Display.
CommandListener - "слушатель", прикрепленный к показываемому объекту Displayable. Он сканирует нажатия софт-клавишь мобильного устройства и в случае нажатия вызывает метод commandAction.

Код

public class MyMidlet extends MIDlet implements CommandListener {
    
    private Form formMidlet;
    private Display mydisplay;
    private MyForm myform;
    
    public Form getMyForm(){
        return formMidlet;
    }
    
    public Display getMydisplay(){
        return mydisplay;
    }

    public void startApp() {
        formMidlet = new Form("Форма мидлета");
        formMidlet.append("Некое содержание мидлета");
        myform = new MyForm(this);
        mydisplay = Display.getDisplay(this);
        mydisplay.setCurrent(myform);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable d) {
        
    }
}



Код

public class MyForm extends Form implements CommandListener {
    
    private Command backToApp;
    private MyMidlet midlet;
    
    MyForm(MyMidlet midl){
        super("Форма 2");
        this.append("Некое содержание формы 2");
        midlet = midl;
        backToApp = new Command("Назад", Command.BACK, 0);
        this.addCommand(backToApp);
        this.setCommandListener(this);
    }
    
    public void commandAction(Command c, Displayable d) {
        if (c == backToApp)  {
            midlet.getMydisplay().setCurrent(midlet.getMyForm());
        }
    }
}

Автор: John2 6.6.2012, 17:14
Kalisnik, спасибо, что помогли разобраться!
Получилось примерно следующее:
Код

public class MyMidlet extends MIDlet implements CommandListener  {
    private Form formMidlet;
    private Display mydisplay;
    private MyForm myForm;
    private Command gotoMyForm;
      
    public void startApp() {
        formMidlet = new Form("Форма мидлета");
        formMidlet.append("Некое содержание мидлета");
        gotoMyForm = new Command("gotoMyForm", Command.SCREEN, 0);
        formMidlet.addCommand(gotoMyForm);
        mydisplay = Display.getDisplay(this);
        formMidlet.setCommandListener(this);
        mydisplay.setCurrent(formMidlet);
    }    
    public void pauseApp() {    }    
    public void destroyApp(boolean unconditional) {    }
    public void commandAction(Command c, Displayable d) {
        if ( c == gotoMyForm ) {            
             myForm = new MyForm(this, formMidlet);
            mydisplay.setCurrent(myForm);            
        }
    }
}


Код

public class MyForm extends Form implements CommandListener {
    /** команда выхода из формы MyForm программы в объект Form, созданный в основном классе мидлет */ 
    public Command backToApp;
    private MIDlet midlet;
    private Display display;
    private Form formMidlet;

    public MyForm( MIDlet midlet, Form formMidlet ) {
        super("Form 2");        
        this.append("Некое содержание формы 2");
        this.midlet = midlet;
        this.formMidlet = formMidlet;
        display =  Display.getDisplay(midlet);
        backToApp = new Command("Back", Command.BACK, 0);
        this.addCommand(backToApp);
        this.setCommandListener(this);
        display.setCurrent(this);        
    }   

    public void commandAction(Command c, Displayable d) {
        if ( c == backToApp ) {
            // необходимо вернуться в  formMidlet определённый в основном классе мидлета    
            display.setCurrent(formMidlet);            
        }
    }    
}


От методов getMyForm() и getMydisplay() пришлось отказаться, поскольку о классе MyForm речь идёт как о библиотечном классе, который будет использоваться в разных мидлетах. 
Но тут возникает вопрос, пока для меня не принципиальный, но всё же интересный, чтобы можно было глубже понять. 
Что если я захочу по команде backToApp возвращаться не к объекту Form, а к примеру Alert. Можно ли ипользовать какой-либо универсальный способ, который подходил бы и к Form и к Alert или Canvas?

Автор: Kalisnik 6.6.2012, 20:59
Цитата(John2 @  6.6.2012,  17:14 Найти цитируемый пост)
Можно ли ипользовать какой-либо универсальный способ, который подходил бы и к Form и к Alert или Canvas? 


Нет ни чего невозможного. Например, можно такое реализовать по средством стека.

Создаем стек и при переходе на другой объект Displayable, показываемый в настоящее время объект Displayable закидываем в стек. Если же нужно вернуться на предыдущее окно, то просто обратно достаем объект Displayable из стека и показываем его на дисплей.

Почитайте в этой http://forum.vingrad.ru/forum/topic-344719.html темке - в ней я задавался похожими вопросами. smile Там и пример со стеком есть. 

P.S. И не важно Alert это или Form, или Canvas. Ибо все они Displayable.

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