MIDP中的事件處理機制在J2ME用戶圖形界面開發中具有舉足輕重的地位,本文將深入分析MIDP高級事件處理機制,本文提供的程序是新手學習不錯的例子。在接下來的文章我會繼續講述低級事件處理機制。
MIDP的事件處理處理機制同樣是采用回調的機制,你可以參考AWT的事件處理原理。在MIDP中分高級事件處理和低級事件處理,前者主要是針對高級UI,而後者主要是這對Canvas這樣的低級UI的。不管怎樣,我們必須首先介紹的是Command類,移動信息設備的輸入主要來自於手機的鍵盤,導航則主要是由按鈕來完成的,例如軟鍵和導航鍵。Command類包裝了動作的信息,但是並沒有包括動作觸發後應該做什麼,這些是在CommanListener內實現的。看看Command的構造器吧
Command command = new Command("退出",Command.EXIT,1),構造器的參數分別表示按鈕的標簽,按鈕的類型和優先級別。移動信息設備是根據後面兩個參數對按鈕進行布局的。
高級事件處理主要由兩個接口來實現,一個是CommandListener,一個是ItemStateListener。在CommandListener中定義了方法commandAction(Command cmd,Displayable disp),我們必須實現這個方法來完成事件處理,告訴應用程序當在disp界面下如果cmd按鈕並按下的時候他應該去做什麼。ItemStateListener中定義了方法itemStateChanged(Item item),應用程序通過他來得到在Form內的item內部狀態發生變化的事件。用戶在進行如下操作的時候都會觸發這樣的事件,調整交互性Guage、在TextField內輸入或者修改內容、修改DateField、改變ChoiceGroup的狀態。
盡管我們已經通過上面的介紹了解了事件處理的機制,但是你會發現我們進行用戶界面導航的時候仍然非常的麻煩,因為這不是在浏覽器上開發界面,我們能做的只能是通過Command來進行處理。下面我將通過一個例子來說明如何使用CommandListener和ItemStateListener,這個例子有兩個界面一個界面用來輸入另一個用來顯示用戶的輸入。在輸入界面如果我們選擇click這個ChoiceGroup,界面會出現另外一個文本輸入,如果我們不選擇他就不會出現。在這樣一個程序中充分說明了如何使用上述兩個接口來完成MIDP高級事件的處理,但是也暴露出了導航難得問題,在以後的文章中我會介紹如何使用MVC的設計模式來解決這個問題。
程序源代碼如下所示:
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class HighLevelMIDlet extends MIDlet
{
private Display display;
private MainUI mainUI;
private DisplayUI displayUI;
protected void startApp() throws MIDletStateChangeException
{
initMIDlet();
}
private void initMIDlet()
{
display = Display.getDisplay(this);
mainUI = new MainUI(this);
displayUI = new DisplayUI(this,mainUI);
display.setCurrent(mainUI);
}
public DisplayUI getDisplayUI()
{
return displayUI;
}
public Display getDisplay()
{
return display;
}
protected void pauseApp()
{
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
}
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
public class MainUI extends Form implements CommandListener, ItemStateListener
{
private HighLevelMIDlet midlet;
private TextField inputField;
private ChoiceGroup choice;
private TextField inputField2;
private int index;
public static final Command cmd = new Command("Display", Command.ITEM, 2);
public MainUI(HighLevelMIDlet midlet)
{
super("form");
this.midlet = midlet;
init();
}
public void init()
{
inputField = new TextField("Input", null, 25, TextField.ANY);
inputField2 = new TextField("Input2", null, 25, TextField.ANY);
choice = new ChoiceGroup("click", Choice.MULTIPLE);
choice.append("Another", null);
this.append(inputField);
this.append(choice);
this.addCommand(cmd);
this.setCommandListener(this);
this.setItemStateListener(this);
}
public void commandAction(Command arg0, Displayable arg1)
{
if(arg0 == cmd)
{
String input = inputField.getString();
System.out.println(input);
midlet.getDisplayUI().setInput(input);
midlet.getDisplay().setCurrent(midlet.getDisplayUI());
}
}
public void itemStateChanged(Item arg0)
{
if(arg0 == choice)
{
if(choice.isSelected(0) == true)
{
index = this.append(inputField2);
}
else
{
this.delete(index);
}
}
}
}
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
public class DisplayUI extends Form implements CommandListener
{
private HighLevelMIDlet midlet;
private StringItem displayItem;
private Displayable backUI;
public static final Command backCommand = new Command("Back", Command.BACK,
2);
public DisplayUI(HighLevelMIDlet midlet,Displayable backUI)
{
super("Display");
this.midlet = midlet;
this.backUI = backUI;
init();
this.addCommand(backCommand);
this.setCommandListener(this);
}
private void init()
{
displayItem = new StringItem("you input", null);
this.append(displayItem);
}
public void setInput(String input)
{
displayItem.setText(input);
}
public void commandAction(Command arg0, Displayable arg1)
{
if(arg0 == backCommand)
{
midlet.getDisplay().setCurrent(backUI);
}
}
}