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


Автор: joker332 21.10.2008, 22:44
написал простенькую програму.Но почему то не хочет работать 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) {
}

}



Заранее спасибо!!

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

Автор: joker332 22.10.2008, 00:30
А где писать изменение екрана тоисть 
Код

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

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

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


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


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

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

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

Автор: Dummy 22.10.2008, 13:00
Цитата(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()

Автор: eugine_s 22.10.2008, 13:19
или как вариант используя 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() ? 

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

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

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