界面跳转

gesanri 2009-07-27 10:47:08
要实现的功能很简单,但总是有问题,麻烦大家看看
首先,主界面:
武汉特色介绍

景点
小吃/小吃街
购物街
。。。

完后点击景点,进入子界面:
黄鹤楼
中山公园
江滩

到此我都实现了,下一步,我点击黄鹤楼,就显示一段描述黄鹤楼的文字,这个位置总报错,程序如下(其中DivPage.java单独运行是可以的,所以错误应该在Main.java):

Main.java


package wuhan;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Main extends MIDlet implements CommandListener{
private Display display;
private Form form;
private Command exit;
private Command process;
private ChoiceGroup characters;
private ChoiceGroup cg;
private int characterIndex;
private TestCanvas canvas;

public Main() {
display = Display.getDisplay(this);
characters = new ChoiceGroup("武汉特色介绍",Choice.EXCLUSIVE);
characters.append("景点", null);
characters.append("小吃/小吃街", null);
characters.append("购物街", null);
characters.append("大型购物商场", null);
characters.append("大型购物超市", null);
characters.append("大学院校", null);
exit = new Command("Exit",Command.EXIT,1);
process = new Command("Process",Command.SCREEN,2);
form = new Form("");
characterIndex = form.append(characters);
form.addCommand(exit);
form.addCommand(process);
form.setCommandListener(this);
}

public void startApp(){
display.setCurrent(form);
}

public void pauseApp(){
}

public void destroyApp(boolean arg0){
}

public void commandAction(Command command,Displayable displayable){
if(command==exit){
destroyApp(true);
notifyDestroyed();
}
else if(command==process){
int x=0;
boolean picks[] = new boolean[characters.size()];
characters.getSelectedFlags(picks);
for(;x <picks.length;x++){
if(picks[x]){
cg = new ChoiceGroup("",Choice.EXCLUSIVE);
switch(x){
case 0: cg.append("黄鹤楼", null);
cg.append("中山公园", null);
cg.append("江滩", null);
break;
case 1: cg.append("热干面", null);
cg.append("豆皮", null);
break;
case 2:
case 3:
case 4:
case 5: break;
default: break;
}
break;
}
}
form.delete(characterIndex);
characterIndex = form.append(cg);
boolean picks2[] = new boolean[cg.size()];
cg.getSelectedFlags(picks2);
if(x==0){
for(int y=0;y<picks2.length;y++){
if(picks2[y]){
switch(y){
case 0: canvas = new TestCanvas(new DivPage());
display.setCurrent(canvas);
break;
default: break;
}
}
}
}
form.delete(characterIndex);
}
}
}



DivPage.java


package wuhan;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class DivPage extends MIDlet {
private Display display;

private TestCanvas canvas;

public DivPage() {
display = Display.getDisplay(this);
canvas = new TestCanvas(this);
}

protected void startApp() throws MIDletStateChangeException {
display.setCurrent(canvas);
}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0) {

}

public void exitMIDlet() {
destroyApp(true);
notifyDestroyed();
}
}

class TestCanvas extends Canvas implements CommandListener {
private String text = " 武汉特色介绍"
+ "\n一、 景点"
+ "\n1、 黄鹤楼"
+ "\n 冲决巴山群峰,接纳潇湘云水,浩荡长江在三楚腹地与其最长支流汉水交汇,造就了武汉隔两江而三镇互峙的伟姿。 这里地处江汉平原东缘,鄂东南丘陵余脉起伏于平野湖沼之间,龟蛇两山相夹,江上舟辑如织黄鹤楼天造地设于斯。"
+ "\n 黄鹤楼是古典与现代熔铸、诗化与美意构筑的精品。她处在山川灵气动荡吐钠的交点,正好映和中华民族喜好登高的民风民俗、亲近自然的空间意识、崇尚宇宙的哲学观念。登黄鹤楼,不仅仅获得愉快,更能使心灵与宇宙意象互渗互融,从而使心灵净化。这大约就是黄鹤楼美的魅力经风雨而不衰,与日月共长存原因之所在。"
+ "\n 巍峨耸立于武昌蛇山的黄鹤楼,享有“天下绝景”的盛誉,与湖南岳阳楼,江西滕王阁并称为“江南三大名楼”。唐代诗人崔颢一首“昔人已乘黄鹤去,此地空余黄鹤楼。黄鹤一去不复返,白云千载空悠悠。晴川历历汉阳树,芳草萋萋鹦鹉洲。日暮乡关何处是,烟波江上使人愁。”已成为千古绝唱,更使黄鹤楼名声大噪。全楼各层布置有大型壁画、楹联、文物等。楼外铸铜黄鹤造型、胜像宝塔、牌坊、轩廊、亭阁等一批辅助建筑,将主楼烘托得更加壮丽。登楼远眺,“极目楚天舒”,不尽长江滚滚来,三镇风光尽收眼底。";

private int sreenWidth;

private int sreenHeight;

private int scrollHeight;

private int scrollY;

private int regionY;

private int numHeight;

private Command exit;

private DivPage divPage;

public TestCanvas(DivPage divPage) {
this.divPage = divPage;
exit = new Command("Exit", Command.EXIT, 1);
addCommand(exit);
setCommandListener(this);
try {
this.sreenHeight = this.getHeight();
this.sreenWidth = this.getWidth();
} catch (Exception e) {
e.printStackTrace();
}
}

protected void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, this.sreenWidth, this.sreenHeight);
Font font = g.getFont();
g.setColor(0x00000);
int row = drawWrapString(g, text, 0, regionY, sreenWidth - 18, font);
if (this.numHeight == 0)
this.numHeight = (row + 1) * font.getHeight();
System.out.println("numHeigth=" + numHeight);
this.scrollHeight = this.sreenHeight * this.sreenHeight / numHeight;
this.scrollY = (-this.regionY) * this.sreenHeight / numHeight;
g.setColor(255);
g.fillRect(this.sreenWidth - 6, 0, 6, this.sreenHeight);
g.setColor(0xFFFFFF);
g.fillRect(this.sreenWidth - 5, this.scrollY, 4, this.scrollHeight);
}

public void keyPressed(int keyCode) {
System.out.println(keyCode);
System.out.println(sreenHeight);
if (keyCode == -2) {
if (this.sreenHeight - this.regionY >= this.numHeight)
return;
this.regionY -= 30;
} else if (keyCode == -1) {
if (this.regionY >= 0)
return;
this.regionY += 30;
}
this.repaint();
}

public void commandAction(Command command, Displayable displayable) {
if (command == exit)
divPage.exitMIDlet();
}


public static int drawWrapString(Graphics g, String str, int x, int y,
int rightMargin, Font font) {
int row = 0;
int leftMargin = x;
int fW = 0;
int fH = font.getHeight();
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
if (c == '\r')
continue;
fW = font.charWidth(c);

if (c == '\n' || (x + fW) > rightMargin) {
x = leftMargin;
y += fH;
row++;
}

if (c != '\n') {
g.drawChar(c, x, y, 20);
x += fW;
}

}
return row;
}
}

...全文
146 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangtou 2011-05-30
  • 打赏
  • 举报
回复
我用C#写界面有一个父页面和8子页面,现在能实现点击父页面上的按钮进入相应的子页面,但是我实现不了子页面之间的跳转 高手帮帮忙~
lj2008525 2009-07-28
  • 打赏
  • 举报
回复
呵呵,
gesanri 2009-07-28
  • 打赏
  • 举报
回复
呵呵,算了,等我到了那步再说,先用笨方法吧
kf156 2009-07-28
  • 打赏
  • 举报
回复
想了好久,数据存代码里,我还真不知道怎么举例。
先抛开数据存哪
说下自动生成目录的思路吧:你理解成HTML页面就比较容易了
首次从index.html页面里得到目录列表,每个目录列表有自己对应的跳转页面地址
选中目录里的某一项,进入。
根据得到对应的页面地址,读取相应页面的内容
判断当前页面里是否还有下级目录?有,展示下级目录:没有,展示当前内容
gesanri 2009-07-28
  • 打赏
  • 举报
回复
。。。 程序自动识别添加目录,这对我来说太难了,有没有具体例子,没有也算了
kf156 2009-07-28
  • 打赏
  • 举报
回复
之前也有公司做过类似的项目,后来...
咳,不看好...

言归正传,如果说是以字符串形式存到程序中的话
那肯定不能说直接代码写死有没有下一级目录,而是要通过程序自动识别添加
还有就是如果每个目录都以一个界面来展示的话,当级数比较多的时候,用户会很烦的。
gesanri 2009-07-28
  • 打赏
  • 举报
回复
那些信息应该是以字符串的形式直接都放在程序中的,不用文件,所以应该是都在jar包里,不从服务器端取,我的问题是因为我主界面就有6个选项,包括景点,小吃/小吃街,超市等等,这些选项又有子目录,比如景点有黄鹤楼,江滩等等,完后有的选项甚至还有子目录,比如超市下面有中百超市,中百超市下面还有武昌中百超市,汉口中百超市等等,选择其中任意一个,都会显示一段描述性的文字,所以整个目录结构很庞大,我这只是先写了极少数的几个所以还看不出来,如果照我这种结构写下去的话,我的Main.class是不是太庞大了,结构似乎不大合理啊
kf156 2009-07-28
  • 打赏
  • 举报
回复
你说的那信息是存在JAR包里,还是从服务端取的?
老张-AI 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kf156 的回复:]
分两个命令就好了。

Java codepackage gesanri;import java.util.Timer;import java.util.TimerTask;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;publicclass Mainextends MIDletimplements CommandListener {public Display display;private Form form;private Command exit;private Command process;private Command enter;private Command back;private ChoiceGroup characters;private ChoiceGroup cg;privateint characterIndex;private TestCanvas canvas;publicstatic Main instance;public Main() {
instance=this;
display= Display.getDisplay(this);
characters=new ChoiceGroup("武汉特色介绍", Choice.EXCLUSIVE);
characters.append("景点",null);
characters.append("小吃/小吃街",null);
characters.append("购物街",null);
characters.append("大型购物商场",null);
characters.append("大型购物超市",null);
characters.append("大学院校",null);
exit=new Command("Exit", Command.EXIT,1);
process=new Command("Process", Command.SCREEN,2);
enter=new Command("Enter", Command.SCREEN,1);
back=new Command("Back", Command.BACK,2);
form=new Form("");
characterIndex= form.append(characters);
form.addCommand(exit);
form.addCommand(process);
form.setCommandListener(this);
}publicvoid startApp() {
display.setCurrent(form);
}publicvoid pauseApp() {
}publicvoid destroyApp(boolean arg0) {
}publicstaticvoid exit() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance=null;
}publicvoid commandAction(Command command, Displayable displayable) {if (command== exit) {
exit();
}elseif (command== process) {
cg=new ChoiceGroup("", Choice.EXCLUSIVE);switch (characters.getSelectedIndex()) {case0:
cg.append("黄鹤楼",null);
cg.append("中山公园",null);
cg.append("江滩",null);break;case1:
cg.append("热干面",null);
cg.append("豆皮",null);break;case2:case3:case4:case5:break;default:break;
}// } form.removeCommand(process);
form.removeCommand(exit);
form.deleteAll();// form.delete(characterIndex); characterIndex= form.append(cg);
form.addCommand(enter);
form.addCommand(back);

}elseif (command== enter) {switch (cg.getSelectedIndex()) {case0:
canvas=new TestCanvas();
display.setCurrent(canvas);break;default:break;
}

}elseif (command== back) {
form.removeCommand(enter);
form.removeCommand(back);
form.deleteAll();
form.append(characters);
form.addCommand(exit);
form.addCommand(process);
}

}
}
[/Quote]
高手 学习了
gesanri 2009-07-28
  • 打赏
  • 举报
回复
真是高手啊,你觉得我这种程序结构是不是有问题啊,因为我现在这只放了很少的信息进去,实际要开发的程序景点,小吃/小吃街,购物街,商场,超市这些目录下都有很多的内容,甚至还有子目录,这样都加进去的话,我的Main.class是不是太庞大了,不符合软件开发的基本要求吧
kf156 2009-07-28
  • 打赏
  • 举报
回复
分两个命令就好了。


package gesanri;

import java.util.Timer;
import java.util.TimerTask;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Main extends MIDlet implements CommandListener {
public Display display;

private Form form;

private Command exit;

private Command process;

private Command enter;

private Command back;

private ChoiceGroup characters;

private ChoiceGroup cg;

private int characterIndex;

private TestCanvas canvas;

public static Main instance;

public Main() {
instance = this;
display = Display.getDisplay(this);
characters = new ChoiceGroup("武汉特色介绍", Choice.EXCLUSIVE);
characters.append("景点", null);
characters.append("小吃/小吃街", null);
characters.append("购物街", null);
characters.append("大型购物商场", null);
characters.append("大型购物超市", null);
characters.append("大学院校", null);
exit = new Command("Exit", Command.EXIT, 1);
process = new Command("Process", Command.SCREEN, 2);
enter = new Command("Enter", Command.SCREEN, 1);
back = new Command("Back", Command.BACK, 2);
form = new Form("");
characterIndex = form.append(characters);
form.addCommand(exit);
form.addCommand(process);
form.setCommandListener(this);
}

public void startApp() {
display.setCurrent(form);
}

public void pauseApp() {
}

public void destroyApp(boolean arg0) {
}

public static void exit() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}

public void commandAction(Command command, Displayable displayable) {
if (command == exit) {
exit();
} else if (command == process) {
cg = new ChoiceGroup("", Choice.EXCLUSIVE);
switch (characters.getSelectedIndex()) {
case 0:
cg.append("黄鹤楼", null);
cg.append("中山公园", null);
cg.append("江滩", null);
break;
case 1:
cg.append("热干面", null);
cg.append("豆皮", null);
break;
case 2:
case 3:
case 4:
case 5:
break;
default:
break;
}
// }
form.removeCommand(process);
form.removeCommand(exit);
form.deleteAll();
// form.delete(characterIndex);
characterIndex = form.append(cg);
form.addCommand(enter);
form.addCommand(back);

} else if (command == enter) {
switch (cg.getSelectedIndex()) {
case 0:
canvas = new TestCanvas();
display.setCurrent(canvas);
break;
default:
break;
}

} else if (command == back) {
form.removeCommand(enter);
form.removeCommand(back);
form.deleteAll();
form.append(characters);
form.addCommand(exit);
form.addCommand(process);
}

}
}

gesanri 2009-07-28
  • 打赏
  • 举报
回复
改了后,昨天的问题解决了,但新的问题又出现了,点击景点直接显示那段描述黄鹤楼的文字了,中间界面:
黄鹤楼
中山公园
江滩
没有显示出来,如何在form.append(cg)后停顿一下,显示当前界面啊
kf156 2009-07-27
  • 打赏
  • 举报
回复
J2ME不允许一个MIDlet调用另一个MIDlet
所以改后只留下一个MIDlet类。

Main.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Main extends MIDlet implements CommandListener {
public Display display;
private Form form;
private Command exit;
private Command process;
private ChoiceGroup characters;
private ChoiceGroup cg;
private int characterIndex;
private TestCanvas canvas;
public static Main instance;

public Main() {
instance = this;
display = Display.getDisplay(this);
characters = new ChoiceGroup("武汉特色介绍", Choice.EXCLUSIVE);
characters.append("景点", null);
characters.append("小吃/小吃街", null);
characters.append("购物街", null);
characters.append("大型购物商场", null);
characters.append("大型购物超市", null);
characters.append("大学院校", null);
exit = new Command("Exit", Command.EXIT, 1);
process = new Command("Process", Command.SCREEN, 2);
form = new Form("");
characterIndex = form.append(characters);
form.addCommand(exit);
form.addCommand(process);
form.setCommandListener(this);
}

public void startApp() {
display.setCurrent(form);
}

public void pauseApp() {
}

public void destroyApp(boolean arg0) {
}

public static void exit() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}

public void commandAction(Command command, Displayable displayable) {
if (command == exit) {
exit();
} else if (command == process) {
int x = 0;
boolean picks[] = new boolean[characters.size()];
characters.getSelectedFlags(picks);
for (; x < picks.length; x++) {
if (picks[x]) {
cg = new ChoiceGroup("", Choice.EXCLUSIVE);
switch (x) {
case 0:
cg.append("黄鹤楼", null);
cg.append("中山公园", null);
cg.append("江滩", null);
break;
case 1:
cg.append("热干面", null);
cg.append("豆皮", null);
break;
case 2:
case 3:
case 4:
case 5:
break;
default:
break;
}
break;
}
}
form.delete(characterIndex);
characterIndex = form.append(cg);
boolean picks2[] = new boolean[cg.size()];
cg.getSelectedFlags(picks2);
if (x == 0) {
for (int y = 0; y < picks2.length; y++) {
if (picks2[y]) {
switch (y) {
case 0:
canvas = new TestCanvas();
display.setCurrent(canvas);
break;
default:
break;
}
}
}
}
form.delete(characterIndex);
}
}
}




TestCanvas.java

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;

public class TestCanvas extends Canvas implements CommandListener {
private String text = " 武汉特色介绍"
+ "\n一、 景点"
+ "\n1、 黄鹤楼"
+ "\n 冲决巴山群峰,接纳潇湘云水,浩荡长江在三楚腹地与其最长支流汉水交汇,造就了武汉隔两江而三镇互峙的伟姿。 这里地处江汉平原东缘,鄂东南丘陵余脉起伏于平野湖沼之间,龟蛇两山相夹,江上舟辑如织黄鹤楼天造地设于斯。"
+ "\n 黄鹤楼是古典与现代熔铸、诗化与美意构筑的精品。她处在山川灵气动荡吐钠的交点,正好映和中华民族喜好登高的民风民俗、亲近自然的空间意识、崇尚宇宙的哲学观念。登黄鹤楼,不仅仅获得愉快,更能使心灵与宇宙意象互渗互融,从而使心灵净化。这大约就是黄鹤楼美的魅力经风雨而不衰,与日月共长存原因之所在。"
+ "\n 巍峨耸立于武昌蛇山的黄鹤楼,享有“天下绝景”的盛誉,与湖南岳阳楼,江西滕王阁并称为“江南三大名楼”。唐代诗人崔颢一首“昔人已乘黄鹤去,此地空余黄鹤楼。黄鹤一去不复返,白云千载空悠悠。晴川历历汉阳树,芳草萋萋鹦鹉洲。日暮乡关何处是,烟波江上使人愁。”已成为千古绝唱,更使黄鹤楼名声大噪。全楼各层布置有大型壁画、楹联、文物等。楼外铸铜黄鹤造型、胜像宝塔、牌坊、轩廊、亭阁等一批辅助建筑,将主楼烘托得更加壮丽。登楼远眺,“极目楚天舒”,不尽长江滚滚来,三镇风光尽收眼底。";

private int sreenWidth;

private int sreenHeight;

private int scrollHeight;

private int scrollY;

private int regionY;

private int numHeight;

private Command exit;

public TestCanvas() {
exit = new Command("Exit", Command.EXIT, 1);
addCommand(exit);
setCommandListener(this);
try {
this.sreenHeight = this.getHeight();
this.sreenWidth = this.getWidth();
} catch (Exception e) {
e.printStackTrace();
}
}

protected void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, this.sreenWidth, this.sreenHeight);
Font font = g.getFont();
g.setColor(0x00000);
int row = drawWrapString(g, text, 0, regionY, sreenWidth - 18, font);
if (this.numHeight == 0)
this.numHeight = (row + 1) * font.getHeight();
System.out.println("numHeigth=" + numHeight);
this.scrollHeight = this.sreenHeight * this.sreenHeight / numHeight;
this.scrollY = (-this.regionY) * this.sreenHeight / numHeight;
g.setColor(255);
g.fillRect(this.sreenWidth - 6, 0, 6, this.sreenHeight);
g.setColor(0xFFFFFF);
g.fillRect(this.sreenWidth - 5, this.scrollY, 4, this.scrollHeight);
}

public void keyPressed(int keyCode) {
System.out.println(keyCode);
System.out.println(sreenHeight);
if (keyCode == -2) {
if (this.sreenHeight - this.regionY >= this.numHeight)
return;
this.regionY -= 30;
} else if (keyCode == -1) {
if (this.regionY >= 0)
return;
this.regionY += 30;
}
this.repaint();
}

public void commandAction(Command command, Displayable displayable) {
if (command == exit)
Main.exit();
// divPage.exitMIDlet();
}

public static int drawWrapString(Graphics g, String str, int x, int y,
int rightMargin, Font font) {
int row = 0;
int leftMargin = x;
int fW = 0;
int fH = font.getHeight();
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
if (c == '\r')
continue;
fW = font.charWidth(c);

if (c == '\n' || (x + fW) > rightMargin) {
x = leftMargin;
y += fH;
row++;
}

if (c != '\n') {
g.drawChar(c, x, y, 20);
x += fW;
}

}
return row;
}
}

13,097

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧