本例由三个类组成:TestMidlet.java TestCanvas.java ParseCode.java 简单的展示如何在J2ME里实现分页效果
以下代码可以直接运行
入口类:TestMidlet.java
import
javax.microedition.lcdui.Display;
import
javax.microedition.lcdui.Displayable;
import
javax.microedition.midlet.MIDlet;
import
javax.microedition.midlet.MIDletStateChangeException;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
TestMidlet
extends
MIDlet
...
{
private static TestMidlet _instance = null;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private Display _display = null;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public TestMidlet() ...{
_instance = this;
_display = Display.getDisplay(this);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
protected void destroyApp(boolean arg0) throws MIDletStateChangeException ...{
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
protected void pauseApp() ...{
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
protected void startApp() throws MIDletStateChangeException ...{ // 启动程序
forward(new TestCanvas());
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static TestMidlet getInstance() ...{
return _instance;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void forward(Displayable next)...{
_instance._display.setCurrent(next);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
主屏幕:TestCanvas.java
import
java.util.Vector;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
javax.microedition.lcdui.Alert;
import
javax.microedition.lcdui.AlertType;
import
javax.microedition.lcdui.Canvas;
import
javax.microedition.lcdui.Font;
import
javax.microedition.lcdui.Graphics;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
TestCanvas
extends
Canvas
implements
Runnable
...
{
static Vector v = null; // 菜单项
static final Font _LowFont = Font.getFont(Font.FACE_MONOSPACE,
Font.STYLE_PLAIN, Font.SIZE_MEDIUM); // 字体类型
static final int _LowColor = 0x000000FF; // 未选中颜色
private static int lowFont_Height;
static final int _HightColor = 0x000000FF; // 选中颜色
static final int _HightBGColor = 0x00CCCCCC; // 背景颜色
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static int width;
static int height;
static int startHeight; // 菜单在屏幕的起始高度
static int menuIndex; // 业务类型菜单选中项的序号
static final int spacing = _LowFont.getHeight() / 2;// 计算两行字之间的空白距离
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private static String title = null;
private static int twidth;
private static int tleft_start;
public static String curMenuText = null; // 当前的名字
public static String curMenuType = null; // 当前的武力
public static String menuType = null; // 武力
public static String menuText = null; // 名字
private static ParseCode pc = null;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Thread menuThread;
private static int numPerPage; // 每页显示的内容数量
private static int totalPage; // 总页数
private static int curPage; // 当前的页数
private static int curItem = 0; // 当前页面显示的最前一条记录位置
private static int curMax; // 当前页面显示的最后一条记录位置
private static boolean hasInit; // 是否初始化了
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public TestCanvas() ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!hasInit)...{
width = getWidth();
height = getHeight();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
pc = new ParseCode();
String test = "98|赵云#98|马超#99|张飞#98|关羽#97|许褚#" +
"96|夏候惇#91|夏候渊#98|典韦#97|黄忠#100|吕布#" +
"97|太史慈#96|甘宁#95|孙策#72|周瑜#93|姜维#";
v = pc.parseString(test);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
curPage = 1;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
title = "请选择武将";
twidth = _LowFont.stringWidth(title);
tleft_start = (width - twidth) / 2;
lowFont_Height = _LowFont.getHeight();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
startHeight = lowFont_Height;
numPerPage = (height - startHeight - spacing)/(lowFont_Height );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(numPerPage < v.size())...{
totalPage = v.size() / numPerPage;
if(v.size() % numPerPage != 0) totalPage++;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
else...{
numPerPage = v.size();
totalPage = 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
hasInit = true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
menuIndex = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
menuThread = new Thread(this);
menuThread.start();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void run() ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (true) ...{
repaint();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
protected void paint(Graphics g) ...{
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, width, height);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if(numPerPage * curPage > v.size())
curMax = v.size();
else
curMax = numPerPage * curPage;
curItem = numPerPage * (curPage - 1);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = curItem; i < curMax; i++)...{
int tmpHeight = startHeight + (i - curItem) * lowFont_Height + spacing;
String str = (String)v.elementAt(i);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
int pos = str.indexOf("|");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(pos != -1)...{
menuType = str.substring(0, pos);
menuText = str.substring(pos+1, str.length());
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}else...{
menuType = null;
menuText = str;
}
int tmpWidth = (width - _LowFont.stringWidth(menuText)) / 2;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ((i - curItem) == menuIndex) ...{
curMenuType = menuType;
curMenuText = menuText;
g.setColor(_HightColor);
g.fillRect(tmpWidth, tmpHeight, _LowFont.stringWidth(curMenuText),
lowFont_Height);
g.setFont(_LowFont);
g.setColor(_HightBGColor);
g.drawString(curMenuText, tmpWidth, tmpHeight, 20);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ...{
g.setFont(_LowFont);
g.setColor(_LowColor);
g.drawString(menuText, tmpWidth, tmpHeight, 20);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(curPage < totalPage)...{ // 还有下一页
String next = "-->";
g.setFont(_LowFont);
g.setColor(_LowColor);
g.drawString(next, width-_LowFont.stringWidth(next), height - lowFont_Height, 20);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(curPage > 1)...{ // 还有上一页
String next = "<--";
g.setFont(_LowFont);
g.setColor(_LowColor);
g.drawString(next, 1, height - lowFont_Height, 20);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
g.setColor(_LowColor);
g.fillRect(0, 0, width, lowFont_Height);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
g.setFont(_LowFont);
g.setColor(0x00FFFFFF);
g.drawString(title, tleft_start, 0, 20);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
protected void keyPressed(int code) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (getGameAction(code) == Canvas.UP & (curItem + menuIndex) > curItem) ...{
menuIndex--; // 按上时且不是第一项, 菜单项序号减1
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else if (getGameAction(code) == Canvas.DOWN & (curItem + menuIndex ) < (curMax - 1)) ...{
menuIndex++; // 按下时且不是最后一项时, 菜单项序号加1
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else if (getGameAction(code) == Canvas.FIRE) ...{ // 响应摇杆选中事件
TestMidlet.forward(new Alert("您选中的武将", "武力:" + curMenuType + " 姓名:" + curMenuText, null, AlertType.INFO));
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else if (getGameAction(code) == Canvas.RIGHT & (curPage < totalPage))...{
curPage ++;
TestMidlet.forward(new TestCanvas());
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else if(getGameAction(code) == Canvas.LEFT & (curPage > 1))...{
curPage --;
TestMidlet.forward(new TestCanvas());
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
解析并获取特定格式的字符串:ParseCode.java
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.UnsupportedEncodingException;
import
java.util.Vector;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
ParseCode
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public Vector parseString(String str)...{
int c = 0;
String content = null;
Vector v = new Vector();
InputStream is = null;
ByteArrayOutputStream baos = null;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ...{
is = new ByteArrayInputStream(str.getBytes("UTF-8"));
baos = new ByteArrayOutputStream();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while ((c = is.read()) != -1) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
switch (c) ...{
case '#':
content = null;
content = new String(baos.toByteArray(), "UTF-8");
v.addElement(content);
baos.reset();
break;
default:
baos.write((char) c);
break;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch (UnsupportedEncodingException e) ...{
e.printStackTrace();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch (IOException e) ...{
e.printStackTrace();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} finally...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
if(is != null)
is.close();
if(baos != null)
baos.close();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(IOException ioe)...{
ioe.printStackTrace();
}
}
return v;
}
}