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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> repaint 
:(
    Опции темы
joker332
Дата 21.10.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



написал простенькую програму.Но почему то не хочет работать repaint().или я его не правильно использую???
Я хочу что бы после нажатия на 1 выполнилось действие вот такое gg.fillRect(height/5,width/2+8,height/6*2,width/7);
Но екран почемуто не перерисовывается??
Код

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



public class Gra extends MIDlet implements CommandListener {
public static int width, height, key1;
public static Graphics gg;

public class Graph extends Canvas {
// функция прорисовки экрана



public void paint(Graphics g) {
gg=g;
// получить ширину экрана
 width = g.getClipWidth();
// получить высоту экрана
 height = g.getClipHeight();
// установить текущий цвет желтым
g.setColor(255,255,0);
// нарисовать закрашенный прямоугольник
// размером на весь экран
g.fillRect(0,0,width,height);
// установить текущий цвет черным
g.setColor(0,0,0);
// нарисовать рамку
g.drawRect(0,0,width-1,height-1);


g.fillRect(height/5,width/7,height/6*2,width/7);
g.fillRect(height/5,width/3,height/6*2,width/7);
g.fillRect(height/5,width/2+8,height/6*2,width/7);

g.setColor(255,255,255);

g.drawString("Арифметичні" ,height/5+5,width/7,g.LEFT|g.TOP);
g.drawString("Тригонометричні" ,height/5+5,width/7+10,g.LEFT|g.TOP);
g.drawString("Логічні" ,height/5+10,width/3+5,g.LEFT|g.TOP);
g.drawString("Комплексні" ,height/5+10,width/2+13,g.LEFT|g.TOP);




repaint();
}
 

public void keyPressed(int keyCode) {
             if (keyCode == Canvas.KEY_NUM1){
                System.out.println("13231");
        gg.setColor(255,255,255);
        gg.fillRect(height/5,width/2+8,height/6*2,width/7);                         

        }
    }

}


public void startApp() {

// создать объект графика
Graph graph = new Graph();
// получить ссылку на менеджер дисплея
Display display = Display.getDisplay(this);
// вывести график на экран
display.setCurrent(graph);

}
public void pauseApp() {
    }

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

}



Заранее спасибо!!
PM MAIL   Вверх
Dummy
Дата 21.10.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, код не совсем корректный:
  •  repaint() в теле paint() не имеет особого смысла.
  •  объект Graphics, передаваемый в paint(), не должен нигде запоминаться
repaint() нужно вызывать в теле keyPressed(), убрав предварительно оттуда все операции с Graphics.

Это сообщение отредактировал(а) Dummy - 21.10.2008, 23:26
PM MAIL   Вверх
joker332
Дата 22.10.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А где писать изменение екрана тоисть 
Код

gg.setColor(255,255,255);
        gg.fillRect(height/5,width/2+8,height/6*2,width/7);  
  
????????                     
PM MAIL   Вверх
Dummy
Дата 22.10.2008, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А все в paint(). Добавить в этот метод необходимую логику таким образом, чтобы в нужных случаях отрисовывалось вот это самое
Код

gg.setColor(255,255,255);
gg.fillRect(height/5,width/2+8,height/6*2,width/7);


Еще один вариант - можно использовать GameCanvas. Тогда можно в любом момент у него получить объект Graphics, вызвав getGraphics(), нарисовать туда что угодно, а потом уже вызвать repaint().


PM MAIL   Вверх
joker332
Дата 22.10.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А можеш показать как это делать???я не совсем понемаю
Заранее благодарен

PM MAIL   Вверх
W0LF
Дата 22.10.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



ну, repaint() это примерно как и gc() он не обязательно сработает. Где-то это уже здесь обсуждлось. serviceRepaint() если не ошибаюсь, этот обязательно переристует

joker332, а почему ты не хочешь заглянуть в WTK**\apps\games например?
там есть примеры и с Canvas и с GameCanvas


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Dummy
Дата 22.10.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(W0LF @  22.10.2008,  12:48 Найти цитируемый пост)
ну, repaint() это примерно как и gc() он не обязательно сработает

Ну, если repaint()'ы не прут каждые 5 микросекунд и текущий Displayable не меняется, то repaint() все же должен отработать. Другое дело, с какой задержкой. В данном случае repaint() можно считать равносильным вызову paint().

joker332, вот тебе ужас, накатанный за 5 минут. Делать красиво лень и некогда:
Код

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;

public class Gra extends MIDlet implements CommandListener {
    public static int width, height, key1;
    
    public class Graph extends GameCanvas {
        protected Graph() {
            super(false);
            paintInitialScreen();
        }

        private void paintInitialScreen() {
            Graphics g = getGraphics();

            // получить ширину экрана
             width = g.getClipWidth();
            // получить высоту экрана
             height = g.getClipHeight();
            // установить текущий цвет желтым
            g.setColor(255,255,0);
            // нарисовать закрашенный прямоугольник
            // размером на весь экран
            g.fillRect(0,0,width,height);
            // установить текущий цвет черным
            g.setColor(0,0,0);
            // нарисовать рамку
            g.drawRect(0,0,width-1,height-1);
            g.fillRect(height/5,width/7,height/6*2,width/7);
            g.fillRect(height/5,width/3,height/6*2,width/7);
            g.fillRect(height/5,width/2+8,height/6*2,width/7);
            g.setColor(255,255,255);
            g.drawString("Арифметичні" ,height/5+5,width/7,g.LEFT|g.TOP);
            g.drawString("Тригонометричні" ,height/5+5,width/7+10,g.LEFT|g.TOP);
            g.drawString("Логічні" ,height/5+10,width/3+5,g.LEFT|g.TOP);
            g.drawString("Комплексні" ,height/5+10,width/2+13,g.LEFT|g.TOP);
            repaint();
        }

        public void keyPressed(int keyCode) {
            Graphics gg = getGraphics();

             if (keyCode == Canvas.KEY_NUM1){
                System.out.println("13231");
                gg.setColor(255,255,255);
                gg.setClip(height/5,width/2+8,height/6*2,width/7);
                gg.fillRect(0, 0, width, height);
            }

            repaint();
        }
    }

    public void startApp() {
        // создать объект графика
        Graph graph = new Graph();
        // получить ссылку на менеджер дисплея
        Display display = Display.getDisplay(this);
        // вывести график на экран
        display.setCurrent(graph);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {

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

Смысл в том, что ты рисуешь разные вещи во внеэкранном буфере (GameCanvas.getGraphics()) в зависимости от состояния приложения - т. е., например, если у тебя выделен 1-й элемент списка, ты рисуешь выделение на первом элементе, если 2-й - на втором и т. п. А когда необходимо выплеснуть это все на дисплей, зовешь GameCanvas.repaint()

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



или как вариант используя Canvas сделать вот так:

Код

boolean flag = false;

public void keyPressed(int keyCode) {

if (keyCode == KEY_NUM1) {
flag = true;
}

}

public void paint(Graphics g) {

//твой код по отрисовке

if (flag ){
g.setColor(255,255,255);
g.fillRect(height/5,width/2+8,height/6*2,width/7);
flag = false;
}

}



Цитата(Dummy @  21.10.2008,  23:26 Найти цитируемый пост)
Да, код не совсем корректный:

    *  repaint() в теле paint() не имеет особого смысла.


На нынешних девайсах я бы такое не делал, а вот когда я начинал только с j2me то помню ребята с опытом (на тот момент) в некоторых портациях использовали именно такой подход (кажется это делалось для Нокии S60).

Добавлено через 1 минуту и 15 секунд
Цитата(Dummy @  22.10.2008,  13:00 Найти цитируемый пост)
А когда необходимо выплеснуть это все на дисплей, зовешь GameCanvas.repaint()


GameCanvas.flushGraphics() ? 
PM MAIL   Вверх
Dummy
Дата 22.10.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(eugine_s @  22.10.2008,  13:19 Найти цитируемый пост)
GameCanvas.flushGraphics() ?  

Вроде как и можно, но мне предпочтительней кажется всю отрисовку на экране делать в paint() - она в этом случае сериализуется с остальными событиями GUI. По умолчанию GameCanvas.paint() делает именно flushGraphics() на весь экран. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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