站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题为什么这个J2ME程序不能在NOKIA的手机上运行?

为什么这个J2ME程序不能在NOKIA的手机上运行?

摘要: 为什么这个J2ME程序不能在NOKIA的手机上运行?


我按照书上的示例编写了下面的程序,在WTK22默认的模拟器上可以运行,在NOKIA的S60模拟器(S60_2nd_FP2_MIDP_SDK_SC)上就不能运行,这是为什么呢?程序运行时,按方向键左右可以在五张图片中来回切换显示。WTK22自带的模拟器运行没有什么问题,S60模拟器就没有显示,还报“Callback threw: java.lang.IllegalArgumentException”错误!每按一下左右键就会报一个“Callback threw: java.lang.IllegalArgumentException”错误!
[code]
import javax.microedition.lcdui.*;
import java.io.*;

public class SSCanvas extends Canvas
{
private Display display;
private Image[] slides;
private String[] caption = {"1","2","3","4","5"};
private int curSlide = 0;

public SSCanvas(Display d)
{
super();
display = d;

//载入幻灯片图像
try
{
slides = new Image[5];
slides[0] = Image.createImage("/01.jpg");
slides[1] = Image.createImage("/02.jpg");
slides[2] = Image.createImage("/03.jpg");
slides[3] = Image.createImage("/04.jpg");
slides[4] = Image.createImage("/05.jpg");
}
catch (IOException e)
{
System.err.println("Failed loading images!");
}
}

void start()
{
display.setCurrent(this);
repaint();
}

public void keyPressed(int keyCode)
{
//从keyCode获取游戏动作
int action = getGameAction(keyCode);

//处理向左或向右按键
switch (action)
{
case LEFT:
if (--curSlide < 0)
curSlide = slides.length - 1;
repaint();
break;

case RIGHT:
if (++curSlide >= slides.length)
curSlide = 0;
repaint();
break;
}
}

public void paint(Graphics g)
{
//清除显示屏
g.setColor(255, 255, 255);//白色
g.fillRect(0, 0, getWidth(), getHeight());

//绘制当前图像
g.drawImage(slides[curSlide], getWidth()/2, getHeight()/2,
Graphics.HCENTER | Graphics.VCENTER);

//设置标题字体
Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,
Font.SIZE_MEDIUM);
g.setFont(f);

//绘制当前标题
g.setColor(0, 0, 0);//黑色
g.drawString(caption[curSlide], getWidth()/2, 0,
Graphics.HCENTER | Graphics.VCENTER);
}
}
[/code]


SlideshowMIDlet.java
----------------------------------------------------------------------------------
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class SlideshowMIDlet extends MIDlet implements CommandListener
{
private SSCanvas canvas;

public void startApp()
{
if (canvas == null)
{
canvas = new SSCanvas(Display.getDisplay(this));
Command exitCommand = new Command("Exit", Command.EXIT, 0);
canvas.addCommand(exitCommand);
canvas.setCommandListener(this);
}
//启动画布
canvas.start();//canvas的start()方法使得MIDlet继续
}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable s)
{
if (c.getCommandType() == Command.EXIT)
{
destroyApp(true);
notifyDestroyed();
}
}
}


路过,友情up...


注意这两句,把锚点换个Graphics.TOP|Graphics.LEFT试试

g.drawImage(slides[curSlide], getWidth()/2, getHeight()/2,
Graphics.HCENTER | Graphics.VCENTER);

g.drawString(caption[curSlide], getWidth()/2, 0,
Graphics.HCENTER | Graphics.VCENTER);


多谢yanhan0615(炮炮)!换成Graphics.TOP|Graphics.LEFT果然可以!这是为什么呢?另外,换成Graphics.TOP|Graphics.LEFT之后,屏幕居中正上方会有文字显示,但是图片只有屏幕右下方四分之一显示,我应该如何修改代码让图片完全居中显示在屏幕上呢?


回复我自己:只修改原代码中drawString语句中的“Graphics.HCENTER | Graphics.VCENTER”为“Graphics.TOP|Graphics.LEFT”,而drawImage语句不变即可。
看来,这个锚点的几个常量值是区分文字和图像使用的。


自己看一下锚点以及drawString方法的说明


多谢Mailbomb(网络咖啡http://blog.csdn.net/mailbomb)提示,我在SDK文档中找到了如下文字:Vertical centering of the text is not specified since it is not considered useful, it is hard to specify, and it is burdensome to implement. Thus, the VCENTER value is not allowed in the anchor point parameter of text drawing calls.

虽然编写这样一个简单程序遇到了这么多困难,但是我也学到一点知识,Go on!


↑返回目录
前一篇: 一个想进入J2ME的新手,请教问题(关于行业及应用特征等)
后一篇: 手机阅读器!帮我解决下,谢谢!