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


Автор: DEMOVERSION 14.3.2006, 19:47
Как правильно организовать переходы между формами.
Например у меня есть 5 форм. Как переходить между ними? Например с главной перейти на вторую, с второй на третею, а с третей на 1. Даные не должны пропадать. Спасибо.

Автор: W0LF 15.3.2006, 02:36
я уже писал об этом
http://forum.vingrad.ru/index.php?showtopic=67097&st=0&#entry641462
Просто там с одной формы на другую и обратно, если надо с 3, 4, 5 на первую то рациональнее будет в конструктор последующей передавать параметр Displayable backToNForm;

Автор: redrick 15.3.2006, 21:35
W0LF, если честно, я не понял какая связь меджду твоим примером в том треде и вопросом.
Ты привел механизм для смены скринов(красиво, единственно - я предпочитаю без instaceof но зато с вызовом некоего init() формочки при каждом setCurrent()), однако там не видно как же при этом должно быть организовано приложение.


DEMOVERSION, ссылочку W0LF-а само собой посмотришь, но вообще
мне больше всего нравится подход из SmartTicket-а:
- заводишь мега-класс типа UIController, в нем пишешь методы, отвечающие за всевозможные события в приложении, в том числе за появление той или иной формочки
- после этого в commandAction() каждой формочки вставляешь вызовы типа UIController.showXXXMenu()
- чтобы можно было делать "back" в общем случае - можно складывать скрины в некий стек и делать из него pop() при нажатии на етот "back"

Автор: W0LF 16.3.2006, 15:35
Хорошо, вот пример:
Код

public class MainMenu extends Form implements CommandListener{ 
    private Command cViewForm1 = new Command("Form1",Command.SCREEN,1);
    public Form1() {
        super("TITLE");
        addCommand(cViewForm1);
        setCommandListener(this);        
    }
    public void showNotify() {
        
        /**
         * Метод, который удаляет все компоненты с формы. Реализовать самому
        */
        deleteAll();                          
        this.setTitle(iTitle);
        ...//добавляем компоненты на форму
    }
    public void hideNotify() {
        ...
    }
    public void commandAction(Command c, Displayable s) {
            if (s == this) {
                if (c == cViewForm1){
                    Main.setDisplay(new Form1(this));
                }
            }            
    }
  





public class Form1 extends Form implements CommandListener{ 
    private Command cBack = new Command("Back",Command.BACK,1);
    private Command cViewForm2 = new Command("Form2",Command.SCREEN,1);
    private Displayable backTo;
    /**
     * Конструктор
     * @param backTo возврат на предыдущую форму(в данном случае MainMEnu)
    */
    public Form1(Displayable backTo) {
        super("TITLE");  
        this.backTo = backTo;
        addCommand(cBack);
        addCommand(cViewForm2);
        setCommandListener(this);        
    }
    public void showNotify() {
        
        /**
         * Метод, который удаляет все компоненты с формы. Реализовать самому
        */
        deleteAll();                          
        this.setTitle(iTitle);
        ...//добавляем компоненты на форму
    }
    public void hideNotify() {
        ...
    }
    public void commandAction(Command c, Displayable s) {
            if (s == this) {
                if  (c == cBack) {
                    Main.setDisplay(backTo);
                }
                if (c == cViewForm2){
                    Main.setDisplay(new Form2(this,backTo));
                }
            }            
    }
  



public class Form2 extends Form implements CommandListener{ 
    private Command cBack = new Command("Back",Command.BACK,1);
    private Command cBackToMain = new Command("MainMenu",Command.SCREEN,1);
    private Displayable backTo;
    private Displayable backToMain;
    /**
     * Конструктор
     * @param backTo возврат на предыдущую форму(Form1)
     * @param backToMain возврат на MainMenu
    */
    public Form1(Displayable backTo, Displayable backToMain) {
        super("TITLE");
        this.backTo = backTo;
        this.backToMain = backToMain;
        addCommand(cBack);
        addCommand(cViewForm1);
        setCommandListener(this);        
    }
    public void showNotify() {
        
        /**
         * Метод, который удаляет все компоненты с формы. Реализовать самому
        */
        deleteAll();                          
        this.setTitle(iTitle);
        ...//добавляем компоненты на форму
    }
    public void hideNotify() {
        ...
    }
    public void commandAction(Command c, Displayable s) {
            if (s == this) {
                if  (c == cBack) {
                    Main.setDisplay(backTo);
                }
                if (c == cBackToMain){
                    Main.setDisplay(backToMain);
                }
            }            
    }
  


Если будешь хранить ссылки на объекты, они будут в памяти, и коллектор не съест их.
Но обычно я создавал новую и хранил ссылку на предыдущую. может это кому и не понравится...

Автор: javastic 17.3.2006, 11:11
Цитата(redrick @ 15.3.2006, 21:35)
- чтобы можно было делать "back" в общем случае - можно складывать скрины в некий стек и делать из него pop() при нажатии на етот "back"

А ещё можно сделать форму с уже встроенным Back'ом (можно в совокупности с Exit'ом) чтобы он активировал "Родителя", после чего наследовать такую форму из любой другой.

Автор: Todd 17.3.2006, 16:23
а почеу нельзя завести просто массив форм и устанавливать ту ,
которая нам нам нужна ?

Автор: redrick 17.3.2006, 23:40
Todd, а нафига ? массив все равно что куча ссылок которые ты не зануляешь - только без имен, а с индексами вместо них

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