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


Автор: hTonus 30.3.2007, 22:01
Привет всем!

Вознискла проблема, а своего умишка решить ее не хватает!  smile 

Телефон SonyEricsson T610. Пишу приложение в котором графическое меню. При нажатии на клавишу BACK - выскакивает аппаратное текстовое окно в котором спрашивается действительно ли я хочу выйти из приложения - жму НЕТ, управление возвращается в приложение, но экран не прорисовывается. Как можно этот момент отследить и принудительно перерисовать менюху? Подскажите пожалста!

Автор: Gameout 31.3.2007, 00:10
Попробуй repaint(), после этой функции должно перерисоваться!

Автор: hTonus 31.3.2007, 10:22
Да эт понятна, можно и serviceRepaints() вызвать, вот только откуда? куда возвращается управление после такого прерывания? Та область что была под окошком сообщения не перерисовывается,  но если продолжить навигацию по меню, то элементы которые выбираю высвечиваются... т.е. я так и остался в этом классе. Но как отловить это событие хз...

Добавлено через 10 минут и 13 секунд
Блин я тормоз, пока писал предыдущее сообщение, понял где ошибка smile Дело в том что для ускорения прорисовки графики я перерисовывал в paint() только те области, которые требуется... ну и не отработал общий случай. Но вопрос все равно остается:

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

Автор: W0LF 31.3.2007, 12:04
Незнаю, правильно ли я понял - 
Код

public class ScreenManager extends Stack {
    private static ScreenManager sManager = null;

    private ScreenManager() {

    }

    public static synchronized ScreenManager getInstance() {
        if (sManager == null) {
            sManager = new ScreenManager();
        }
        return sManager;
    }

    public void pushScreen(Displayable disp) {
        super.push(disp);
        Main.setDisplay(disp);
    }

    public void replaceScreen(Displayable disp) {
        super.pop();
        super.push(disp);
        Main.setDisplay(disp);
    }

    public void popScreen(int count) {
        Displayable disp = null;
        for (int i = 0; i < count; i++) {
            super.pop();
            if (super.empty()) {
                Main.getInstance().notifyDestroyed();
            } else {
                disp = (Displayable) super.peek();
            }
        }
        if (disp != null) {
            Main.setDisplay(disp);
        }
    }

    public void popScreen() {
        popScreen(1);
    }

}

public class MainMenu extends Canvas {

    private class MainMenu2 extends Canvas {
        public MainMenu2() {
            setFullScreenMode(true);
        }

        public void paint(Graphics g) {
            g.setColor(0x008000);
            g.fillRect(80, 50, 100, 120);
            g.setColor(0xFFFFFF);
            g.drawString("Quit?", 90, 60, Graphics.TOP | Graphics.LEFT);
            g.drawString("Yes", 90, 150, Graphics.TOP | Graphics.LEFT);
            g.drawString("No", 160, 150, Graphics.TOP | Graphics.LEFT);
        }

        protected void keyPressed(int i) {
            switch (i) {
                //for MIDP20, Nokia, SonyEricsson : left soft key
                case -6 :
                    //Destriy app
                    break;
                    //for MIDP20, Nokia, SonyEricsson : right soft key
                case -7 :
                    //changing display
                    ScreenManager.getInstance().popScreen();
                    break;
            }
        }

    }

    public MainMenu() {
        setFullScreenMode(true);
    }

    public void paint(Graphics g) {
        g.setColor(0);
        g.fillRect(0, 0, 240, 320);
        g.setColor(0xFFFFFF);
        g.drawString("Quit", 10, 280, Graphics.TOP | Graphics.LEFT);
    }

    protected void keyPressed(int i) {
        switch (i) {
            //for MIDP20, Nokia, SonyEricsson : left soft key
            case -6 :
                MainMenu2 mm2 = new MainMenu2();
                //changing display
                ScreenManager.getInstance().pushScreen(mm2);
                break;
        }
    }

}

Автор: javastic 1.4.2007, 14:07
hTonus, смотри в сторону pauseApp()

Автор: hTonus 1.4.2007, 14:46
WOLF: это все здорово но я пишу под MIDP 1.0...

javastic: да я смотрел на эту хрень, но так и не понял с чем ее едят... просветишь?

Автор: W0LF 1.4.2007, 14:57
Цитата(hTonus @  1.4.2007,  14:46 Найти цитируемый пост)
WOLF: это все здорово но я пишу под MIDP 1.0...

Чет я не понял.. а что из того что я написал под первый мидп не пойдет?

Автор: javastic 1.4.2007, 16:04
hTonus, с тем что когда у тебя какой-то внешний фактор, то твой мидлет находится в режиме ожидание и срабатывает метод pauseApp там можно поставить какую-либо логику.
Еще поиграйся с методами
resumeRequest()  и notifyPaused() 

просто пропиши в них вывод текста и сам всё увидишь, а как сделать репайнт потом сам поёмешь.

Автор: hTonus 1.4.2007, 16:32
Цитата(W0LF @ 1.4.2007,  14:57)
Цитата(hTonus @  1.4.2007,  14:46 Найти цитируемый пост)
WOLF: это все здорово но я пишу под MIDP 1.0...

Чет я не понял.. а что из того что я написал под первый мидп не пойдет?

Прости не разобрался, пойдет канечно, но эт несколько не то что мне нужно, точнее совсем не то...
----------------------------------------------------------------------------------------------
Добавлено @ 16:34
Цитата(javastic @ 1.4.2007,  16:04)
hTonus, с тем что когда у тебя какой-то внешний фактор, то твой мидлет находится в режиме ожидание и срабатывает метод pauseApp там можно поставить какую-либо логику.
Еще поиграйся с методами
resumeRequest()  и notifyPaused() 

просто пропиши в них вывод текста и сам всё увидишь, а как сделать репайнт потом сам поёмешь.

И то верно, попробую спасиб!

Еще фенечку обнаружил: 

DataInputStream.reset () - В SonyEricsson T610 нет такого метода. Пока отловил упарился smile

Автор: W0LF 1.4.2007, 16:37
Цитата

Нет там такого класса :(

Какого класса?

Автор: hTonus 1.4.2007, 16:48
Цитата(W0LF @ 1.4.2007,  16:37)
Цитата

Нет там такого класса :(

Какого класса?

Читай выше. Немнога разминулись. Идея хорошая, но несколько не по теме.

Автор: W0LF 1.4.2007, 16:54
Цитата

Немнога разминулись. Идея хорошая, но несколько не по теме.

угу. я понял smile

Автор: hTonus 1.4.2007, 21:10
Цитата(W0LF @ 1.4.2007,  16:54)
Цитата

Немнога разминулись. Идея хорошая, но несколько не по теме.

угу. я понял smile

Кстати разве метод setFullScreenMode(true); не из MIDP 2?

Автор: W0LF 1.4.2007, 21:19
Цитата

Кстати разве метод setFullScreenMode(true); не из MIDP 2? 

угу smile этот оттуда.. но я показыл механизм работы смены экранов.. его можно и убрать

Автор: nagliyvred 2.4.2007, 11:31
В классе Canvas есть 2 метода showNotify() и hideNotify(). Вызываются соответственно при установке на Display данного канваса и при его снятии с Display.  Я обрабатываю отрисовку при паузах, экранчиках типа "хотите выйти?" "разрешить передачу данных?" и т.п. именно в этих методах

Автор: hTonus 2.4.2007, 14:50
Цитата(nagliyvred @ 2.4.2007,  11:31)
В классе Canvas есть 2 метода showNotify() и hideNotify(). Вызываются соответственно при установке на Display данного канваса и при его снятии с Display.  Я обрабатываю отрисовку при паузах, экранчиках типа "хотите выйти?" "разрешить передачу данных?" и т.п. именно в этих методах

Так они вызываются до вывода на экран и после снятия. Как ими можно пользоваться? Тогда твое служебное окно будет ждать пока отрисуется  Канвас. и проблема то не в отрисовке, а в скорости смены самих канвасов, заметил что пауза весьма значительная. Мне пришлось сделать манагер меню (рисованных) в который загружаю классы меню. и он их на одном канвасе крутит. Выигрыш в скорости в разы! Лирика...

 smile Я не ахти какой какой явапис, расскажи как пользоваться описанными методами, если не трудна...


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