2011-11-28 29 views
1

有一个Canvas它有两个Command s。问题是,当画布第一次打开,然后命令工作,但是当我第二次打开它时,命令不起作用!这里是代码:命令有时不起作用

package view; 

import java.io.IOException; 
import java.io.InputStream; 
import javax.microedition.io.Connector; 
import javax.microedition.io.file.FileConnection; 
import javax.microedition.lcdui.Canvas; 
import javax.microedition.lcdui.Command; 
import javax.microedition.lcdui.CommandListener; 
import javax.microedition.lcdui.Displayable; 
import javax.microedition.lcdui.Graphics; 
import javax.microedition.lcdui.Image; 
import javax.microedition.lcdui.StringItem; 


public class DetailPhotoClient extends Canvas implements CommandListener { 

    private Command delete, back; 
    private GaleriePhotos backForm; 
    private FileConnection fcFile; 
    private Image sourceImage; 
    private InputStream is; 
    private boolean ok,oom, io; 

    public DetailPhotoClient(GaleriePhotos prevForm, String absolutePathphotoName) 
    { 
     super(); 

     back = new Command("Retour", Command.SCREEN, 1); 
     addCommand(back); 

     delete = new Command("Supprimer", Command.SCREEN, 2); 
     addCommand(delete); 

     setCommandListener(this); 

     backForm = prevForm; 

     ok = true; 
     oom = false; 
     io = false; 

     try { 
      fcFile = (FileConnection) Connector.open(absolutePathphotoName, Connector.READ); 
      is = fcFile.openInputStream(); 
      sourceImage = Image.createImage(is); 
      is.close(); 
      fcFile.close(); 
     } catch (IOException ex) { 
      handleException(); 
     } catch (OutOfMemoryError oome) { 
      handleOOM(); 
     } 
    } 
    private void handleException() { 
     ok = false; 
     io = true; 
     repaint(); 
    } 
    private void handleOOM() { 
     ok = false; 
     oom = true; 
     repaint(); 
    } 
    protected void paint(Graphics g) { 

     StringItem chp; 
     int chpW; 
     int x, y = getHeight()/2; 

     g.fillRect(0, 0, getWidth(), getHeight()); 

     if (ok) 
      g.drawImage(sourceImage, 0, 0, Graphics.TOP | Graphics.LEFT); 

     if (io) 
     { 
      chp = new StringItem(null,"Erreur média et/ou d'entrée-sortie !"); 
      chpW = chp.getPreferredWidth(); 
      x = (getWidth() - chpW)/2 ; 
      g.setColor(16711422); 
      if (x<0) 
       g.drawString("Erreur média et/ou d'entrée-sortie !", 0, y, Graphics.TOP | Graphics.LEFT); 
      else 
       g.drawString("Erreur média et/ou d'entrée-sortie !", x, y, Graphics.TOP | Graphics.LEFT); 
     } 

     if (oom) 
     { 
      chp = new StringItem(null,"Mémoire insuffisante !"); 
      chpW = chp.getPreferredWidth(); 
      x = (getWidth() - chpW)/2 ; 
      g.setColor(16711422); 
      if (x<0) 
       g.drawString("Mémoire insuffisante !", 0, y, Graphics.TOP | Graphics.LEFT); 
      else 
       g.drawString("Mémoire insuffisante !", x, y, Graphics.TOP | Graphics.LEFT); 
     } 
    } 
    public void commandAction(Command c, Displayable d) { 
     if (c == back) 
      backForm.showBack(); 
     else 
     { 
      backForm.showBack(); 
      backForm.deletePhoto(); 
     } 
    } 
} 

那么,为什么命令有时不工作?使用阿尔卡特OT-806D手机测试应用程序

+0

我注意到代码'backForm.showBack();'是问题的原因。那么如何通过Canvas进行'LWUIT'形式的'back'导航? – pheromix

+0

当您从'backForm'返回画布时,是否将CommandListener设置回Canvas?我注意到你在代码中的构造函数中执行它。或者,你是否每次都销毁'DetailPhotoClient'? –

+0

在'backForm'的'actionPerformed'中,我调用了'Display.getDisplay(controler).setCurrent(new DetailPhotoClient(this,absolutePathPhotoName))''',它是一个LWUIT窗体。 – pheromix

回答

1

那么您的代码广泛暴露于与CommandListener相关的威胁开始。你看,任何一段代码“外”类可以让你的命令irresponsive:

void makeItDeaf(DetailPhotoClient detailPhotoClient) { 
    detailPhotoClient.setCommandListener(null); 
    // voila! your commands will be still visible but 
    // wouldn't respond anymore 
} 

要确保你不小心打破命令监听像上面,“隐藏”它大致如下:

//...  
public class DetailPhotoClient extends Canvas { // no "implements" here 

    private Command delete, back; 
    private GaleriePhotos backForm; 
    private FileConnection fcFile; 
    private Image sourceImage; 
    private InputStream is; 
    private boolean ok,oom, io; 

    public DetailPhotoClient(GaleriePhotos prevForm, 
      String absolutePathphotoName) 
    { 
     super(); 

     back = new Command("Retour", Command.SCREEN, 1); 
     addCommand(back); 

     delete = new Command("Supprimer", Command.SCREEN, 2); 
     addCommand(delete); 

     backForm = prevForm; 

     setCommandListener(new CommandListener() { 
      public void commandAction(Command c, Displayable d) { 
       if (backForm == null) { 
        System.out.println("backForm is null: ignore command"); 
        return; 
       } 
       if (c == back) { 
        System.out.println("back command"); 
        backForm.showBack(); 
       } else { 
        System.out.println("delete command"); 
        backForm.showBack(); 
        backForm.deletePhoto(); 
       } 
      } 
     }); 

     ok = true; 
     oom = false; 
     //... 
    } 
    //... 
} 
+0

@pheromix你如何测试你的代码?你使用模拟器吗? – gnat

+0

@pheromix还有,你是否尝试用'backForm'测试你的代码是一个普通的lcdui Displayable,而不是LWUIT屏幕? – gnat

+0

98%的项目是用LWUIT构建的,只有2个UI是javame的东西。 – pheromix