forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Проблема с getGraphics() (http://forum.boolean.name/showthread.php?t=14316)

foldel 28.02.2011 00:15

Проблема с getGraphics()
 
В чем ошибка?


import javax.microedition.midlet.*;

public class Midlet extends MIDlet {

public void startApp() {
javax.microedition.lcdui.Display.getDisplay(this). setCurrent(new MIDPCanvas());
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}

import javax.microedition.lcdui.*;

public class MIDPCanvas extends Canvas {

public NewClass NC;

public MIDPCanvas() {
NC = new NewClass();
}

public void paint(Graphics g) {
for (int i = 0; i < 255; i++) {
g.drawImage(NC.I, 10, 10, 20);
repaint();
}
}
}

import javax.microedition.lcdui.*;

public class NewClass {

public Image I;

public NewClass() {
try {
I = Image.createImage("/Back.png");
Graphics G = I.getGraphics();/// Ошибка возикает здесь ///
G.setColor(0x00ff00);
G.fillRect(0, 0, 10, 10);
} catch (Exception Ex) {
Ex.printStackTrace();
}
}
}

java.lang.IllegalStateException
at javax.microedition.lcdui.Image.getGraphics(), bci=16
at NewClass.<init>(NewClass.java:11)
at MIDPCanvas.<init>(MIDPCanvas.java:9)
at Midlet.startApp(Midlet.java:7)
at javax.microedition.midlet.MIDletTunnelImpl.callSta rtApp(), bci=1
at com.sun.midp.midlet.MIDletPeer.startApp(), bci=7
at com.sun.midp.midlet.MIDletStateHandler.startSuite( ), bci=269
at com.sun.midp.main.AbstractMIDletSuiteLoader.startS uite(), bci=52
at com.sun.midp.main.CldcMIDletSuiteLoader.startSuite (), bci=8
at com.sun.midp.main.AbstractMIDletSuiteLoader.runMID letSuite(), bci=161
at com.sun.midp.main.AppIsolateMIDletSuiteLoader.main (), bci=26
javacall_lifecycle_state_changed() lifecycle: event is JAVACALL_LIFECYCLE_MIDLET_SHUTDOWNstatus is JAVACALL_OK

NetBeans IDE 6.9

YellowAfterlife 28.02.2011 12:00

Ответ: Проблема с getGraphics()
 
Первая (логичная) приходящая в голову мысль - файла нет, или он назван не так (Back.png != back.png). Попробуйте вставить следующие две строчки после I = Image...:
Код:

System.out.println("Image width: " + I.getWidth());
System.out.println("Image height: " + I.getHeight());

В консоль \ панель вывода должно вывести размеры изображения. Если будет 0, 0 то значит с изображением что-то не так.

Жека 30.03.2011 07:26

Ответ: Проблема с getGraphics()
 
foldel, тут дело в том, что нельзя рисовать в "неизменяющиеся" (immutable) картинки. загруженная из файла картинка именно такой и является.
Как быть? Вот:

а. Грузишь свою картинку из файла [img1]
б. Создаёшь новую картинку, с размерами той, которую грузил, через Image.createImage(width, height) [img2]
в. Получаешь Graphics у картинки img2 [gfx]
г. Рисуешь в gfx картинку img1
д. Рисуешь в gfx всё что нужно было нарисовать поверх img1

Замечание: при создании картинки img2 она заливается белым фоном автоматически, поэтому теряется прозрачность, если она была в img1.
Вернуть её можно, пробежав по всем пикселям картинки img2 и заменив точки с цветом фона на точки с цветом 0.
Пиксели можно получить через img2.getRGB(), а заново картинку создать через Image.createRGBImage().


Часовой пояс GMT +4, время: 11:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot