📄 converter.java
字号:
/* * * Copyright 2004 FlashMan.Ncuhome.com Inc. All Rights Reserved. * * 我的第一个J2ME程序习作 * 用于在支持J2ME以及MIDP1.0的手机上进行不同货币单位的汇率换算(PS:其实是用于友人的作业) * 本程序共有3个类,其中2个功能类 * Math类用来处理浮点数的四则运算 * MyInput类生成输入框,为的是更方便的输入数值. * * 本例中我有两个问题 * 1.List组件的setSelectedIndex(int elementNum,boolean selected)方法为何不能将 * 光标定位在指定的列上 * 2.在这个程序中我自定义了一个输入框类,能不能用不太麻烦的方法使它能像系统自带 * 的输入框一样支持光标显示 * * 而且还有好些不足之处 * 1.用户不可以自已添加/删除货币单位及汇率,仅能通过联网更新 * 2.从菜单中选择Restore Rate时不经用户确认就将数据库复位 * 3.代码不够优化(比如:用了太多的Command对象引用) * * 有一点需要提醒一下的是通过联网更新汇率的方法只在Jbuilder9自带的J2ME Wireless Toolkit 1.0 * 能正常连网,如果是J2ME Wireless Toolkit 2.1的SDK就会发现点enter准备更新的时候它会"善意"的告诉 * 你程序想要访问网络,这将会产生某些费用,然后给你两个选择Yes/No.再然后你就会发现它已经死掉了,不论 * 你选择的是YesOrNo.我相信这是模拟器自身的问题.所以我想最好还是安安心心的用Toolkit 1.0SDK进行调试吧 * * 有任何建议和意见请发邮件至itfeihu@163.com * 也可通过我的早期作品闪狐超酷Flash留言板给我留言 flashbook.ncuhome.com * 同时欢迎访问我的个人主页 flashman.ncuhome.com * 当然也欢迎访问我们的校园网站"南昌大学家园网" * * * 狐狸 * 2004-6-9 */import javax.microedition.midlet.*;import javax.microedition.lcdui.*;import javax.microedition.rms.*;import javax.microedition.io.*;import java.io.*;public class Converter extends MIDlet implements CommandListener { String dbName = "Converter"; //数据库名 String CurrencyName[]; //用于存放货币单位的数组 String Rate[][]; //用于存放货币之间的交叉汇率 String money_s = "0"; //存放源货币值 String money_t = "0"; //存放目标货币值 int source = 0; //源货币单位在数组中的位置 int object = 0; //目标货币单位在数组中的位置 int selected = 0; //当前选择的菜单项位置 String updateURL; //更新汇率的网址 Alert alert = new Alert("Alert"); //用于提示信息的Alert Display display; //屏幕对象 MyInput myInput; //自定义的输入框 Math math = new Math(); //浮点运算对象 public Converter() { alert.setType(AlertType.WARNING); //设置alert的类型 alert.setTimeout(3000); //alert的显示时间 display = Display.getDisplay(this); //获得对屏幕控制的引用 } public void startApp() { openDb(); //从数据库中获取汇率和恢复上一次正常退出时的状态 main(); //运行界面 renewVar(); //更新所有的变量状态 } public void pauseApp() {} public void destroyApp(boolean unconditional) {} List list; //定义一个List组件用于显示选单 Command cmdExit; //定义一个Command按纽组件 void main() { cmdExit = new Command("Exit", Command.EXIT, 0); //生成Command对象(显示内容,按纽型态,显示优先级) list = new List("Rate Converter", Choice.IMPLICIT); //生成List(主选单)(标题,型态[单选]) //添入各个选单 list.append("From " + CurrencyName[source], null); list.append("To " + CurrencyName[object], null); list.append("Rate 1:" + Rate[source][object], null); list.append("Valuta:" + money_s, null); list.append("Result:" + money_t, null); //添入系统选单 list.addCommand(cmdExit); list.addCommand(new Command("Update rate", Command.SCREEN, 0)); list.addCommand(new Command("Restore rate", Command.SCREEN, 0)); list.addCommand(new Command("About", Command.SCREEN, 0)); list.setCommandListener(this); //设置事件监听 list.setSelectedIndex(selected, true); //设置光标定位在上次操作选定的选单 //但不知为何就是不行,明明是说设成true的,这是我的问题之一 display.setCurrent(list); //显示内容 } //选择源货币单位 List sourceList; Command sourceEnter; Command sourceCancel; void SelectSource() { sourceList = new List("Choose Source", Choice.EXCLUSIVE); sourceEnter = new Command("Enter", Command.OK, 0); sourceCancel = new Command("Cancel", Command.CANCEL, 1); for (int I = 0; I < CurrencyName.length; I++) { //将货币单位全部添至选单 sourceList.append(CurrencyName[I], null); //null这个位置的参数可以用来显示图像 } //添加系统选单及设置事件监听 sourceList.addCommand(sourceEnter); sourceList.addCommand(sourceCancel); sourceList.setCommandListener(this); sourceList.setSelectedIndex(source, true); //设置光标定位在上次操作选定的选单,但和前面一样无效 display.setCurrent(sourceList); } //选择目标货币单位 List objectList; Command objectEnter; Command objectCancel; void SelectObject() { //同上 objectList = new List("Choose Object", Choice.EXCLUSIVE); objectEnter = new Command("Enter", Command.OK, 0); objectCancel = new Command("Cancel", Command.CANCEL, 1); for (int I = 0; I < CurrencyName.length; I++) { objectList.append(CurrencyName[I], null); } objectList.addCommand(objectEnter); objectList.addCommand(objectCancel); objectList.setCommandListener(this); objectList.setSelectedIndex(object, true); //设置光标定位在上次操作选定的选单,照样无效 display.setCurrent(objectList); } Command setRateEnter; Command setRateCancel; void setRate() { //修改汇率 myInput = new MyInput(34, 53, Rate[source][object]); //在x:34,y:53的位置显示输入框,并传递原汇率值 setRateEnter = new Command("Enter", Command.OK, 0); myInput.addCommand(setRateEnter); setRateCancel = new Command("Cancel", Command.CANCEL, 1); myInput.addCommand(setRateCancel); display.setCurrent(myInput); myInput.setCommandListener(this); } Command inputEnter; Command inputCancel; void inputMoney() { //输入货币金额 myInput = new MyInput(34, 69); //指定位置显示一个空白的输入框 inputEnter = new Command("Enter", Command.OK, 0); myInput.addCommand(inputEnter); inputCancel = new Command("Cancel", Command.CANCEL, 1); myInput.addCommand(inputCancel); display.setCurrent(myInput); myInput.setCommandListener(this); } Command reverseEnter; Command reverseCancel; void reverseMoney() { //反向金额输入 myInput = new MyInput(33, 85); //指定位置显示一个空白的输入框 reverseEnter = new Command("Enter", Command.OK, 0); myInput.addCommand(reverseEnter); reverseCancel = new Command("Cancel", Command.CANCEL, 1); myInput.addCommand(reverseCancel); display.setCurrent(myInput); myInput.setCommandListener(this); } TextField input; Command updateEnter; Command updateCancel; void updateRate() { //连网更新数据 Form form = new Form("Update rate"); updateEnter = new Command("Enter", Command.OK, 0); form.addCommand(updateEnter); updateCancel = new Command("Cancel", Command.CANCEL, 0); form.addCommand(updateCancel); input = new TextField("Update's URL:", updateURL, 100, TextField.URL); form.append(input); form.setCommandListener(this); display.setCurrent(form); } public void commandAction(Command c, Displayable s) { //用于响应所有的操作事件 if (c.getLabel() == "Restore rate") { //初始化数据库 dbInitialize(); startApp(); return; } if (c.getLabel() == "Update rate") { //汇率更新界面 updateRate(); return; } if (c.getLabel() == "About") { //汇率更新界面 alert.setString("Copyright(c)2004 FlashMan.Ncuhome.Com"); //提示无效的URL链接或无效的数据页 alert.setTimeout(6000); display.setCurrent(alert); alert.setTimeout(3000); return; } if (c == updateEnter) { //汇率主更新程序(汇率更新界面) StartUpdate(); return; } if (c == updateCancel) { //取消更新(汇率更新界面) main(); return; } if (c == sourceEnter) { //源货币单位选择 source = sourceList.getSelectedIndex(); money_t = math.Multiplication(money_s, Rate[source][object]); //计算货币单位变更后的转换结果 main(); return; } if (c == sourceCancel) { //取消选择源货币(源货币单位选择界面) main(); return; } if (c == objectEnter) { //目标币单位选择 object = objectList.getSelectedIndex(); money_t = math.Multiplication(money_s, Rate[source][object]); //计算货币单位变更后的转换结果 main(); return; } if (c == objectCancel) { //取消选择目标货币(源货币单位选择界面) main(); return; } if (c == cmdExit) { //正常退出 saveDb(); //将各变量状态保存至数据库 notifyDestroyed(); return; } if (c == inputEnter) { //转换值输入确定时 money_s = myInput.value.toString(); if (money_s.length() < 1) { money_s = "0"; } money_t = math.Multiplication(money_s, Rate[source][object]); //计算转换结果 main(); return; } if (c == inputCancel) { //取消输入时 main(); return; } if (c == reverseEnter) { //在结果中输入确定时 money_t = myInput.value.toString(); if (money_s.length() < 1) { money_s = "0"; } money_s = math.Division(money_t, Rate[source][object]); //计算转换结果 main(); return; } if (c == reverseCancel) { //取消输入时 main(); return; } if (c == setRateEnter) { //设定已选定的源/目标货币之间的汇率 if (CurrencyName[source] != CurrencyName[object]) { ; //源货币不等于目标货币则进行下列更新操作 Rate[source][object] = myInput.value.toString(); //更新汇率 Rate[object][source] = math.Division("1", Rate[source][object]); //反向更新汇率 money_t = math.Multiplication(money_s, Rate[source][object]); //更新结果 } main(); return; } if (c == setRateCancel) { //取消汇率设定 main(); return; } switch (list.getSelectedIndex()) { //根据选定的选单进行相应的操作 case 0: selected = 0; SelectSource(); //选择源货币单位 break; case 1: selected = 1; SelectObject(); //选择目标货币单位 break; case 2: selected = 2; setRate(); //设定汇率 break; case 3: selected = 3; inputMoney(); //输入转换值 break; case 4: selected = 4; reverseMoney(); //反向转换输入值 break; } } void openDb() { //从数据库中获取汇率和恢复上一次正常退出时的状态 try { RecordStore rs = RecordStore.openRecordStore(dbName, false); /* 定义数据库的引用对象 第二个参数如果是true代表如果指定的数据库不存在,则系统将自动建立一个新的数据库 反之则抛出RecordStoreNotFoundException异常 */ byte bytes[]; String str; bytes = rs.getRecord(1); //取出第一行记录,本程序将其设置的是货币单位 str = new String(bytes, 0, bytes.length); //将取出的bytes型数据转成字符型 str = str.trim(); //剔除空行 CurrencyName = newArray(str, ","); //更新一维数组变量CurrencyName bytes = rs.getRecord(2); //同上,汇率 str = new String(bytes, 0, bytes.length); str = str.trim(); Rate = newArrayPlanar(str, "|", ","); //更新二维数组变量Rate bytes = rs.getRecord(3); //同上,程序状态 str = new String(bytes, 0, bytes.length); str = str.trim(); /*更新最后一次正常退出时的程序状态,如: str="50,413.5,1,2,0,http://localhost/rate.asp" 需将其转换成数组 */ String tmpArray[] = newArray(str, ","); money_s = tmpArray[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -