2015-05-17 6 views
1

Я пытаюсь получить изображение на экране в любом месте цикла только, что я не могу обновить Canvas. Как я могу это сделать? Вот пример кода:Как обновить изображение или холст java me Midp 2.0?

Вопрос в том, как можно обновить холст?

class KeyCanvas extends Canvas { 
     int x=50;int y=50; 
     Image image = null; 
     private Random rnd = new Random(); 

     public KeyCanvas() { 
      for (int I=0; I<=5; I++){ 
       x = rnd.nextInt(146) + 1; 
       y = rnd.nextInt(150) + 1; 
       try { 
      Thread.sleep(1000); 
      } catch (Exception ex) {} 
      repaint(); 
      } 
     } 

     public void paint(Graphics g) { 
      try{image = Image.createImage("/ship01.JPG"); 
      }catch(Exception e){ 
      e.printStackTrace();} 
      g.drawImage(image, x, y, Graphics.HCENTER | Graphics.VCENTER); 
     } 

     protected void keyPressed(int keyCode) { 
      System.out.println("keyPressed " +((char)keyCode)); 

     } 
    } 

ответ

0

Не уверен, что вы подразумеваете под обновлением. Глядя на ваш код, он должен нарисовать изображение просто отлично. Если вы говорите об очистке холста, прежде чем снова рисовать образ, это, как правило, делается это так:

g.setClip(0, 0, getWidth(), getHeight()); 
g.setColor(0x000000); // Colour to clear with 
g.fillRect(0, 0, getWidth(), getHeight()); 

Другое дело: Не загружайте изображение внутри метода paint(). Загрузите его за пределы основного контура. Нет необходимости перезагружать его каждый раз, когда вы хотите его нарисовать.

0

Во-первых, mr_lou прав насчет загрузки изображения в paint(). Во-первых, его можно повторно использовать и его следует использовать повторно по соображениям производительности, а во-вторых, может быть опасно использовать блокирующий ввод-вывод в методе, называемом системой (здесь paint()).

Что выглядит очень странно для меня, так это то, что анимация (со сном) реализована в конструкторе. Интересно, как вы делаете холст видимым - анимация заканчивается, прежде чем вы сможете это сделать, или нет? Следующая вещь, чтобы проверить, не создать ли экземпляр canvas из другого обратного вызова (например, keyReleased и т. Д.), Поскольку он, вероятно, заблокирует поток событий.

0

Да, конечно, я проигнорировал его, если в случае, прежде чем я дал пример моей проблемы в том, что он не мог обновить краску среди изменений, которые я нашел решение для него таким образом:

import java.util.Random; 

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

public class pro extends MIDlet { 
    Display display; 
    Command exit; 
    static int id=1; 

    public pro() { 
     display = Display.getDisplay(this); 
    } 
    public void destroyApp (boolean unconditional) { 
    } 
    public void pauseApp() {} 
    public void startApp() { 
     display = Display.getDisplay(this); 

     Canvas canvas = new Canvas() { 
     int x;int y; 
     Image image = null; 
     Random rnd = new Random(); 

     public void paint(Graphics g) { 

     if (id==1){id=2; 
     try{image = Image.createImage("/ship01.JPG"); 
     }catch(Exception e){ 
     e.printStackTrace();}} 

     g.setColor(0x000000); 
     g.fillRect(0,0,getWidth(),getHeight()); 
     x = rnd.nextInt(146) + 1; 
     y = rnd.nextInt(150) + 1; 

     g.drawImage(image, x, y, Graphics.HCENTER | Graphics.VCENTER); 
     } 

     protected void keyPressed(int keyCode) { 
     System.out.println("keyPressed " +((char)keyCode)); 
     } 
    }; // end of anonymous class 

    display.setCurrent(canvas); 

    for (int I=0; I<=5; I++){ 
    try {Thread.sleep(1000); 
    } catch (Exception ex) {} 
    canvas.repaint(); 
    } 

    } 
}