2011-11-28 5 views
1

Canvas에는 두 개의 Command이 있습니다. 문제는 캔버스를 처음 열면 명령이 작동하지만 두 번째로 열면 명령이 작동하지 않는다는 것입니다. 다음은 코드입니다.명령이 작동하지 않는 경우가 있습니다.

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' 형태로'뒤로'네비게이션을 만드는 방법은? – pheromix

+0

'backForm'에서 Canvas로 돌아 가면 CommandListener를 다시 Canvas로 설정합니까? 나는 당신이 당신의 코드에서 생성자에서 그것을 알아 차렸다. 아니면 매번'DetailPhotoClient'를 파기 하시겠습니까? –

+0

LWUIT Form 인'backForm'의'actionPerformed'에서'Display.getDisplay (controler) .setCurrent (new DetailPhotoClient (this, absolutePathPhotoName)); '를 호출합니다. – pheromix

답변

1

코드가 CommandListener와 관련된 위협에 노출되기 시작합니다. 코드의 조각 클래스는 응답 불가 당신의 명령을 "외부"할 수있다, 봐 :

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'이 LWUIT 화면 대신에 일반 lcdui Displayable 인 코드를 테스트하려고 했습니까? – gnat

+0

내 프로젝트의 98 %가 LWUIT로 작성되었으며, 단지 2 개의 UI가 javame 작업입니다. – pheromix