【发布时间】:2011-11-29 17:29:08
【问题描述】:
有一个Canvas 有两个Commands。问题是,当第一次打开画布时,命令起作用,但是当我第二次打开它时,命令不起作用!代码如下:
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 手机测试应用
【问题讨论】:
-
我注意到代码
backForm.showBack();是问题的原因。那么如何将back从 Canvas 导航到LWUIT表单? -
当您从
backForm回到 Canvas 时,您是否将 CommandListener 设置回 Canvas?我注意到您在代码的构造函数中执行此操作。或者,你每次都在破坏DetailPhotoClient? -
在
backForm的actionPerformed中,这是一个LWUIT 表单,我调用Display.getDisplay(controler).setCurrent(new DetailPhotoClient(this, absolutePathPhotoName));。 -
所以你每次都在创建一个新的画布。尽量不要这样做,有些设备不喜欢每个应用使用多个 Canvas。
-
你为什么加入 LWUIT?你在使用 LWUIT 吗?
标签: java-me lcdui midp-2.0 cldc