Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принцип смены содержимого экрана? 
:(
    Опции темы
Kalisnik
Дата 2.3.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Странное дело... при нажатии на любую кнопку Command получаю исключение вида: TRACE: <at java.lang.NullPointerException:   0>, Exception caught in Display class

Код

package pkg;

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

public class Midlet extends MIDlet {
    
    private Display display;
    private Stra str, str2, str3;
    
    public void startApp() {
        display = Display.getDisplay(this);
        
        str = new Stra("Форма 1");
        
        display.setCurrent(str);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

}


Код

package pkg;

import javax.microedition.lcdui.*;


public class Stra extends Form implements CommandListener{
    
    private ChoiceGroup choice;
    private Command exit;
    private Command ok;
    private Command back;
    
    Stra(String formTitle){
        super(formTitle);
        
        exit = new Command("Выход", Command.EXIT, 1);
        ok = new Command("Далее", Command.OK, 0);
        back = new Command("Назад", Command.BACK, 0);
        
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        append(choice);
        addCommand(back);
        addCommand(ok);
        addCommand(exit);
    }

    public void commandAction(Command c, Displayable d) {
        System.out.println("OUT: START");
        if(c == ok){
            System.out.println("OUT: OK");
        }else if(c == back){
            System.out.println("OUT: BACK");
        }else if(c == exit){
            System.out.println("OUT: EXIT");
        }
        
    }
    
}


PM MAIL   Вверх
oxigen
Дата 2.3.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



В конструктор добавь
Код

setCommandListener(this);


PM MAIL   Вверх
Kalisnik
Дата 2.3.2012, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



да... стыдно.

Кстати, мне кажется многие неоправдано боятся использовать статику?

Ну вот такой получился у меня финальный вариант версии 0.5 smile. Инкапсулировал как мог.

Код

package pkg;

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

public class Midlet extends MIDlet {
    
    public static Midlet midl;
    private Display display;
    private Stra str;
    
    public Stra getStr(){
        return str;
    }
    
    public Display getDisplay(){
        return display;
    }
    
    public void startApp() {
        midl = this;
        display = Display.getDisplay(this);
        str = new Stra("Форма 1");
        display.setCurrent(str);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

}


Код


package pkg;

import java.util.Stack;
import javax.microedition.lcdui.*;


public class Stra extends Form implements CommandListener{
    
    private ChoiceGroup choice;
    private Command exit;
    private Command ok;
    private Command back;
    private Stra str2, str3;
    private static Stack stack;
    
    Stra(String formTitle){
        super(formTitle);
        
        exit = new Command("Выход", Command.EXIT, 1);
        ok = new Command("Далее", Command.OK, 0);
        back = new Command("Назад", Command.BACK, 0);
        
        choice = new ChoiceGroup("Выбор формы: ", ChoiceGroup.POPUP);
        choice.append("один", null);
        choice.append("два", null);
        choice.append("три", null);
        choice.setLayout(Item.LAYOUT_LEFT);
        append(choice);
        addCommand(back);
        addCommand(ok);
        addCommand(exit);
        setCommandListener(this);
        if(stack == null){
            stack = new Stack();
        }
    }
    
    private void back(){
        if(!stack.isEmpty()){
            Midlet.midl.getDisplay().setCurrent((Displayable)stack.pop());
        }
    }
    
    private Stra getFormByIndex(int i, Displayable d){
        Stra st = null;
        if(i == 0){
            st = Midlet.midl.getStr();
            stack.push(d);
        }else if(i == 1){
            if(str2 == null){
                str2 = new Stra("Форма 2");
            }
            st = str2;
            stack.push(d);
        }else if(i == 2){
            if(str3 == null){
                str3 = new Stra("Форма 3");
            }
            st = str3;
            stack.push(d);
        }
        return st;
    }

    public void commandAction(Command c, Displayable d) {
        if(c == ok){
            Midlet.midl.getDisplay().setCurrent(getFormByIndex(choice.getSelectedIndex(), d));
        }else if(c == back){
            back();
        }else if(c == exit){
            Midlet.midl.destroyApp(true);
        }
        
    }
    
}



Это сообщение отредактировал(а) Kalisnik - 2.3.2012, 20:09
PM MAIL   Вверх
oxigen
Дата 2.3.2012, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



Неправильный вариант получился :(

У вас при каждом нажатии будут создаваться новые "Форма2" и "Форма3".

Старт - создали новый Stra("Форма1"). У него поля str2 = null и str3 = null
Нажали 2 создали новый Stra("Форма2"). У него поля str2 = null и str3 = null
Нажали 3 создали новый Stra("Форма3"). У него поля str2 = null и str3 = null
Нажали 2 создали новый Stra("Форма2"). У него поля str2 = null и str3 = null
Пройдите дебагером или sysout в конструкторе поставьте - сами увидите.

static поля - общие для всех объектов класса, а нестатичные - свои для каждого объекта.

А вот "Форма1" создастся один раз и будет работать правильно. Вы ее через статический static Midlet midl получаете.


Код

 public Stra getFormByIndex(int i, Displayable d)

От метода, судя по названию ожидаю, что он должен возвращать форму. Зачем он делает еще что-то неочевидное? 
Принимает  Displayable просто чтоб положить его в стек.

Логичнее будет выглядеть 
Код

 if(c == ok){
   stack.push(d);
   Midlet.midl.getDisplay().setCurrent(getFormByIndex(choice.getSelectedIndex()));
}



P.S. Да, излишняя статика это вроде плохо. Правда совершенно не помню, почему :(
Вроде там причины не технические, а идеологические.

Это сообщение отредактировал(а) oxigen - 2.3.2012, 20:22
PM MAIL   Вверх
Kalisnik
Дата 2.3.2012, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Да, забыл здесь static поставить
Код

private static Stra str2, str3;

Это и называется утечкой памяти? Я создавал каждый раз новые объекты, тем самым занимая память?
Пишу в NetBeans. Отладчиком пока не научился пользоваться - это ведь и есть дебагер?


Метод тоже исправил. Я его у Вас же и скопипастил. Потом баловался с ним, в итоге он был скопирован из класса Midlet целиком, и не прошел проверку на актуальность. smile Спасибо.
В остальном нареканий нет?

Это сообщение отредактировал(а) Kalisnik - 2.3.2012, 22:15
PM MAIL   Вверх
oxigen
Дата 3.3.2012, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



private static Stra str2, str3;

Тогда возникает один вопрос, Вот есть 3 формы. Абсолютно равноправные и равноценные.
Но str хранится в Midlet а str2 и str3 в Stra.
Явно просится их в одном месте хранить и однотипно пользоваться.

Если в Stra, то
Код

public class Stra extends Form implements CommandListener{
    private static Stra str, str2, str3;

     public static Stra getFormByIndex(int index) { //метод работает только со static полями, значит и сам static
     .....
    }

public class Midlet extends MIDlet {
 
public void startApp() {
        midl = this;
        display = Display.getDisplay(this);
        Stra str = Stra.getFormByIndex(0);
        display.setCurrent(str);
    }
}


Это и называется утечкой памяти? Я создавал каждый раз новые объекты, тем самым занимая память?
Дело не столько в расходовании памяти. Если есть необходимость создавать каждый раз именно новые формы - то создавайте.
Тут скорее поведение будет отличаться.

Если формы статические, то вызываете
Код

str2 - установили checkbox на "три"
str3
str2 - видите checkbox установленым на "три", так как это та же самая форма и она сохранила свое состояние


А если формы будут каждый раз через new создаваться, то 
Код

new Stra("2") - установили checkbox на "три"
new Stra("3")
new Stra("2") - новая форма никак не связаная с предыдущей и с независимым от нее состоянием.

Так что все зависит от того, какое поведение Вам нужно.

Ага. Отладчик это дебагер. По NetBeans ничего подсказать не смогу. Никогда не пользовался.

Это сообщение отредактировал(а) oxigen - 3.3.2012, 11:41
PM MAIL   Вверх
Kalisnik
Дата 3.3.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



Явно просится их в одном месте хранить и однотипно пользоваться. - заметано.
Дело не столько в расходовании памяти. Если я не ошибаюсь, Java имеет механизм сборки мусора, так что, в принципе, что бы произошла утечка памяти нужно постараться? smile

PM MAIL   Вверх
Kalisnik
Дата 14.4.2012, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.6.2011

Репутация: нет
Всего: нет



oxigen, а по мимо MVC какие еще модели есть? Мне как-то сложно представить приложение без единого, общего контроллера... пусть даже оно максимально инкапсулировано. Ведь в любой стране должен быть свой президент или король. У высокоразвитых организмов - голова. Иначе, хаос.  Как без контроллера?
PM MAIL   Вверх
oxigen
Дата 17.4.2012, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 12.4.2010

Репутация: 4
Всего: 4



С государством хороший пример. 
Чем больше аспектов контролирует государство - тем больше и сложнее его бюрократический аппарат. 
Вы идете в магазин - покупаете хлеб. Напрямую взаимодействуете с продавцом. Просто.
А если Вы даете деньги государству, а оно дает их продавцу? То государство должно иметь данные обо всех продавцах, обо всех товарах, иметь возможность передать деньги от каждого продавца к каждому покупателю... Возникающие накладные расходы представляете.

А в для программы президент/король - это программист. Именно вы создаете инструкции для поведения на все случаи жизни. И вопрос в том - дать эти инструкции сразу конкретным исполнителям или ввести для них дополнительный контроллер.
Мне больше нравится первый подход - из-за наглядности. Смотришь на отдельный класс и видишь, что он будет делать в конкретных случаях. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0845 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.