3.4 Alert 这个类比较有意思,它是用来提醒用户关于错误或者其他异常情况的屏幕对象,这个警告只能作为简短的信息记录和提醒,如果我们需要长一点的,我们可以使用其它的Screen子类,最常见的是Form。同时我们顺便提一下跟它相关的一个类AlertType,需要提醒读者注意的一点是AlertType是一个本身无法实体化的工具类。(即我们不能象Form那样产生具体的对象) AlertType共有5个类型:ALARM(警报),CONFIRMATION(确定),ERROR(错误),INFO(信息提示),WARNING(警告)。 Alert是一个比较特殊的屏幕对象,当我们在setCurrent()方法中调用它的时候,它会先发出一段警告的声音,然后彩绘显示在屏幕上,过了一段时间之后,它会自动跳回之前的画面。 我们需要注意的是我们必须在使用setCurrent()显示Alert之前定义好它可以跳回的画面,否则会发生异常。 在Alert中我们可以通过setTimeout()方法来设定间隔的时间,setType()来调用我们上面提到的四种类型,setImage()来定义图片,setString()来定义内含文字,同时通过getType(),getImage(),getString()来取得相应的对象。 当Alert显示了我们在setTimeout()中指定的间隔时间后,它会跳回我们之前指定的对象,如果我们在指定显示时间时传入了Alert.FOREVER作为参数,这时,除非用户按下定义哈哦的接触键,否则,屏幕会一直显示这个Alert。如果在一个定时的Alert中只有一个命令,那么超时发生时命令会自动激活。 import javax.microedition.lcdui.*; import javax.microedition.midlet.MIDlet; public class AlertDemo extends MIDlet { private final static Command CMD_EXIT = new Command("Exit", Command.EXIT, 1); private final static Command CMD_SHOW = new Command("Show", Command.SCREEN, 1); private final static String[] typeStrings = { "Alarm", "Confirmation", "Error", "Info", "Warning" }; private final static String[] timeoutStrings = { "2 Seconds", "4 Seconds", "8 Seconds", "Forever" }; private final static int SECOND = 1000; private Display display; private boolean firstTime; private Form mainForm; public AlertDemo() { firstTime = true; mainForm = new Form("Alert Options"); } protected void startApp() { display = Display.getDisplay(this); showOption(); } /** * 制造这个MIDlet的基本显示 * 在这个Form里面我们可以选择Alert的个中类型和特性 */ private void showOption() { if(firstTime) { // choice-group for the type of the alert: // "Alarm", "Confirmation", "Error", "Info" or "Warning" ChoiceGroup types = new ChoiceGroup("Type", ChoiceGroup.POPUP, typeStrings, null); mainForm.append(types); // choice-group for the timeout of the alert: // "2 Seconds", "4 Seconds", "8 Seconds" or "Forever" ChoiceGroup timeouts = new ChoiceGroup("Timeout", ChoiceGroup.POPUP, timeoutStrings, null); mainForm.append(timeouts); // a check-box to add an indicator to the alert String[] optionStrings = { "Show Indicator" }; ChoiceGroup options = new ChoiceGroup("Options", Choice.MULTIPLE, optionStrings, null); mainForm.append(options); mainForm.addCommand(CMD_SHOW); mainForm.addCommand(CMD_EXIT); mainForm.setCommandListener(new AlerListener(types, timeouts, options)); firstTime = false; } display.setCurrent(mainForm); } private class AlerListener implements CommandListener { AlertType[] alertTypes = { AlertType.ALARM, AlertType.CONFIRMATION, AlertType.ERROR, AlertType.INFO, AlertType.WARNING }; ChoiceGroup typesCG; int[] timeouts = { 2 * SECOND, 4 * SECOND, 8 * SECOND, Alert.FOREVER }; ChoiceGroup timeoutsCG; ChoiceGroup indicatorCG; public AlerListener(ChoiceGroup types, ChoiceGroup timeouts, ChoiceGroup indicator) { typesCG = types; timeoutsCG = timeouts; indicatorCG = indicator; } public void commandAction(Command c, Displayable d) { if (c == CMD_SHOW) { int typeIndex = typesCG.getSelectedIndex(); Alert alert = new Alert("Alert"); alert.setType(alertTypes[typeIndex]); int timeoutIndex = timeoutsCG.getSelectedIndex(); alert.setTimeout(timeouts[timeoutIndex]); alert.setString( typeStrings[typeIndex] + " Alert, Running " + timeoutStrings[timeoutIndex]); boolean[] SelectedFlags = new boolean[1]; indicatorCG.getSelectedFlags(SelectedFlags); if (SelectedFlags[0]) { Gauge indicator = createIndicator(timeouts[timeoutIndex]); alert.setIndicator(indicator); } display.setCurrent(alert); } else if (c == CMD_EXIT) { destroyApp(false); notifyDestroyed(); } } } protected void destroyApp(boolean unconditional) { } protected void pauseApp() { } /** * 我们在这里生成Alert的indicator. * 如果这里没有timeout, 那么这个indicator 将是一个 "非交互性的" gauge * 用有一个后台运行的thread更新. */ private Gauge createIndicator(int maxValue) { if (maxValue == Alert.FOREVER) { return new Gauge(null, false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING); } final int max = maxValue / SECOND; final Gauge indicator = new Gauge(null, false, max, 0); // if (maxValue != Gauge.INDEFINITE) { new Thread() { public void run() { int value = 0; while (value < max) { indicator.setValue(value); ++value; try { Thread.sleep(1000); } catch (InterruptedException ie) { // ignore } } } }.start(); } return indicator; } } 3.5 Form概述 Form是J2ME里面一个比较重要的容器类型,可以说是集中了高级UI中的精华,是开发当中常常用到的一个关键类,下图很好的说明了FORM及其相关子类的关系: 我们通常是往Form里面添加个中Item的子类(使用append()方法),从而达到让画面更加丰富的目的,每一个Item的子类在同一时刻只能属于同一个容器,否则会引发异常。 在Form画面中,我们通过Item.LAYOUT_LEFT、Item.LAYOUT_CENTER和Item.LAYOUT_RIGHT来控制各个Item在Form的位置,通过这几个参数的字面意思我们很容易明白分别是左,中,右。在不设定的情况下,Item会依照LAYOUT_DEFAULT来绘制,如果我们希望自己来设定等效线,可以用setLayout()这个方法来控制。 同时,Form缺省的设定会在空间足够的情况下,尽可能让Item出现在同一个逻辑区域中。如果组件在显示时,比我们预期的最大的尺寸要大(或比预期最小尺寸更小),那么系统会自动忽略我们之前的设定,转而采用最大尺寸或者最小尺寸,这时系统会自动调用setPreferredSize(),将预期尺寸设置好。 3.6 StringItem及ImageItem 3.6.1 StringItem StringItem的作用,从它字面上意思来看就可以很明白,就是在屏幕上显示一串字,配合不同的外观类型, StringItem有两个构造函数,最长见的是需要三个参数的,第一个是Label,第二个是内容,第三个则是外观,外观共分三种:PLAIN,BUTTON,HYPERLINK,(只需两个参数的构造函数等同于使用PLAIN的外观的三个参数的构造函数),对于外观的提取,我们可以使用getAppearanceMode()取得,以此类推,需要修改/得到相应的参数只需进行相应的set/get操作即可。 我们可以把Item和其他的高级UI部分结合起来,这样也是对我们学习的一种促进: import javax.microedition.lcdui.*; import javax.microedition.midlet.MIDlet; public class StringItemDemo extends MIDlet implements CommandListener, ItemCommandListener { private Display display; private Form mainForm; private final static Command CMD_GO = new Command("Go", Command.ITEM, 1); private final static Command CMD_PRESS = new Command("Press", Command.ITEM, 1); private final static Command CMD_EXIT = new Command("Exit", Command.EXIT, 1); protected void startApp() { display = Display.getDisplay(this); mainForm = new Form("String Item Demo"); mainForm.append("This is a simple label"); StringItem item = new StringItem("This is a StringItem label: ", "This is the StringItems text"); mainForm.append(item); item = new StringItem("Short label: ", "text"); mainForm.append(item); item = new StringItem("Hyper-Link ", "hyperlink", Item.HYPERLINK); item.setDefaultCommand(CMD_GO); item.setItemCommandListener(this); mainForm.append(item); item = new StringItem("Button ", "Button", Item.BUTTON); item.setDefaultCommand(CMD_PRESS); item.setItemCommandListener(this); mainForm.append(item); mainForm.addCommand(CMD_EXIT); mainForm.setCommandListener(this); display.setCurrent(mainForm); } public void commandAction(Command c, Item item) { if (c == CMD_GO) { String text = "Go to the URL..."; Alert a = new Alert("URL", text, null, AlertType.INFO); display.setCurrent(a); } else if (c == CMD_PRESS) { String text = "Do an action..."; Alert a = new Alert("Action", text, null, AlertType.INFO); display.setCurrent(a); } } public void commandAction(Command c, Displayable d) { destroyApp(false); notifyDestroyed(); } protected void destroyApp(boolean unconditional) { } protected void pauseApp() { } }

评论