簡體   English   中英

J2ME按鈕命令不起作用

[英]J2ME button command not working

我正在研究j2me應用程序,我很難處理命令按鈕。 有人可以幫幫我嗎。 按鈕被假定為第二種形式,但是當我點擊它時,它不起作用。 這是我的代碼:

        import javax.microedition.midlet .*; 
        import javax.microedition.lcdui .*; 
        import javax.microedition.lcdui.StringItem;
        import javax.microedition.lcdui.TextField;
        import javax.microedition.lcdui.DateField;
        import javax.microedition.lcdui.Command;
        import javax.microedition.lcdui.Alert;
        import javax.microedition.pim.PIM;
        import javax.microedition.pim.PIMItem;
        import javax.microedition.pim.PIMException;
        import java.util.Date;
        import java.util.Enumeration;
        import javax.microedition.lcdui.Choice;
        import javax.microedition.lcdui.List;
        import javax.microedition.pim.ToDo;
        import javax.microedition.pim.ToDoList;
        import javax.microedition.lcdui.Displayable;
        import javax.microedition.lcdui.Display;
        import javax.microedition.lcdui.Form;
        import javax.microedition.lcdui.CommandListener;

        public class MainMidlet extends MIDlet implements CommandListener, 
        ItemCommandListener { 

        private Form aform, bform, addToDoForm; 
        private Command okCommand; 
        private Command exitCommand;
        private Command cmdAddTodo;
        private Command cmdretrieveTodo;
        private Command cmdExit;
        private Command backCommand;
        private Command hllinkCommand; 
        private Command b1Command, b2Command; 
        private Display aDisplay; 
        private StringItem hlstringItem,hlstringItem2; 
        private StringItem b1stringItem, b2stringItem, b1stringItem2, b2stringItem2;   
        private Alert hlAlert; 
        private Alert b1Alert, b2Alert;
        private TextField summaryField;
        // Date field for Due data of ToDo.
        private DateField dueDateField;
        // Date field for end data of ToDo.
        private TextField noteField;
        // Text field to set priority of ToDo.
        private TextField priorityField;
        private List listTodos;
        private ToDoList todoList;
        private ToDo todo;

        public MainMidlet () { 
        okCommand = new Command ( "OK", Command.OK, 1); 
        exitCommand = new Command ( "EXIT", Command.EXIT, 1);
        backCommand = new Command ( "BACK", Command.BACK, 1);
        hllinkCommand = new Command ( "LINK", Command.ITEM, 2); 
        b1Command = new Command ( "BUTTON", Command.ITEM, 2);
        b2Command = new Command ( "BUTTON", Command.ITEM, 2);

        aform = new Form ( "CyberMe");

        // if click hyperlink "here", display anAlert 
        hlstringItem = new StringItem (null, "here", Item.HYPERLINK); 
        hlstringItem.setItemCommandListener (this); 
        hlstringItem.setDefaultCommand (hllinkCommand); 

        b1stringItem = new StringItem (null, "Make ToDo", Item.BUTTON); 
        b1stringItem.setItemCommandListener (this); 
        b1stringItem.setDefaultCommand (b1Command);

        b2stringItem = new StringItem (null, "Set Alarm", Item.BUTTON); 
        b2stringItem.setItemCommandListener (this); 
        b2stringItem.setDefaultCommand (b2Command);

        /*hlstringItem2 = new StringItem (null, "here", Item.HYPERLINK); 
        hlstringItem2.setItemCommandListener (this); 
        hlstringItem2.setDefaultCommand (hllinkCommand); 

        b1stringItem2 = new StringItem (null, "Make ToDo", Item.BUTTON); 
        b1stringItem2.setItemCommandListener (this); 
        b1stringItem2.setDefaultCommand (b1Command);

        b2stringItem2 = new StringItem (null, "Set Alarm", Item.BUTTON); 
        b2stringItem2.setItemCommandListener (this); 
        b2stringItem2.setDefaultCommand (b2Command);*/


        hlAlert = new Alert ( "Item.HYPERLINK", "You Can Call Me 800-8101234" 
        , null, AlertType.INFO); 
        b1Alert = new Alert ( "Item.Button", "You click ToDo!" 
        , null, AlertType.INFO);
        //b2Alert = new Alert ( "Item.Button", "You click Alarm!" 
        //, null, AlertType.INFO);


        aform.append ( "What do you want to do?"); 
        aform.append (hlstringItem); 
        aform.append (b1stringItem);
        aform.append (b2stringItem);

        aform.addCommand (okCommand); 
        aform.addCommand (exitCommand); 
        aform.setCommandListener (this); 

        /*bform.append ( "What do you want to do?"); 
        bform.append (hlstringItem2); 
        bform.append (b1stringItem2);
        bform.append (b2stringItem2);

        bform.addCommand (okCommand); 
        bform.addCommand (backCommand); 
        bform.setCommandListener (this); */

        }

        /*public void SecondPage(){
        if(checkPIMSupport() == false) {
        exitMIDlet();
        }

        setComponents();
        }

        /**
        * Initializes components of MIDlet.
        */
        public void setComponents() {

        aDisplay = Display.getDisplay(this);

        // Create form for adding ToDo.
        addToDoForm = new Form("ToDo");

        // Add commands to form and set listener for it.
        cmdAddTodo = new Command("Add Todo", Command.SCREEN, 0);
        cmdretrieveTodo = new Command("Retrieve All Todos", Command.SCREEN, 0);
        addToDoForm.addCommand(cmdAddTodo);
        addToDoForm.addCommand(cmdretrieveTodo);

        cmdExit = new Command("Exit", Command.EXIT, 0);
        addToDoForm.addCommand(cmdExit);

        addToDoForm.setCommandListener(this);
        listTodos = new List("ToDo list", Choice.IMPLICIT);
        backCommand =new Command("Back", Command.BACK, 0);
        listTodos.addCommand(backCommand);
        listTodos.setCommandListener(this);

        try {

        StringBuffer supported = new StringBuffer();

        // Get list of ToDos.
        todoList = (ToDoList)PIM.getInstance().openPIMList(
        PIM.TODO_LIST, PIM.READ_WRITE);

        // Create controls based on supported fields for ToDo.
        if(todoList.isSupportedField(ToDo.SUMMARY) == true) {
        summaryField = new TextField("Summary", null, 20,
                                TextField.ANY);
        addToDoForm.append(summaryField);
        } 

        else {

        supported.append("Summary field\n");
        removeCommand();

        }

        if(todoList.isSupportedField(ToDo.DUE) == true) {
        dueDateField = new DateField("Date",
                                DateField.DATE_TIME);
        dueDateField.setDate(new Date());
        addToDoForm.append(dueDateField);

        }

        else {

        supported.append("Due date field\n");
        removeCommand();

        }


        if(todoList.isSupportedField(ToDo.NOTE) == true) {
        noteField = new TextField("Information", null, 20, TextField.ANY);
        addToDoForm.append(noteField);
        }

        else {

        supported.append("Note field\n");
        }

        if(todoList.isSupportedField(ToDo.PRIORITY) == true) {
        priorityField = new TextField("Priority", null, 20,
                                TextField.NUMERIC);

        addToDoForm.append(priorityField);
        }
        else {

        supported.append("Priority field\n");
        removeCommand();
        }

        if(supported.length()!=0){

            StringItem si = new StringItem("ToDo field not supported", "");     
            si.setText(supported.toString());
            addToDoForm.append(si);
        }


        } catch(PIMException pimExc) {
        // TODO: Handle error on working with PIM.
        }
        catch(SecurityException secExc) {
        // TODO: Handle error on access to PIM.
        }
        catch(Exception exc) {
        // If unknown error was caught, show it to the end user.
        showAlert("Info", exc.toString());  
        }

        }

        // Remove the command for adding ToDos
        public void removeCommand(){
        addToDoForm.removeCommand(cmdAddTodo);
        }

        public void listToDos() {

        Enumeration todos = null;

        try {
        todoList = (ToDoList) PIM.getInstance().openPIMList(PIM.TODO_LIST, PIM.READ_WRITE);

        } catch (PIMException e) {
        // Cannot open ToDo list
        showAlert("Info", "Failed to open a ToDo list: "+e.toString());  
        return;
        } catch (SecurityException e) {
        // User rejects application's request for reading ToDo list
        showAlert("Info", "Reading ToDo List rejected: "+e.toString());  
        return;
        }

        try {
        // Get the enumeration of all ToDo elements
        todos = todoList.items();

        } catch (PIMException e) {
        // Failed to retrieve elements
        showAlert("Info", "This application cannot retrieve ToDos: "+e.toString());  
        }

        if (listTodos.size() > 0) {
        listTodos.deleteAll();
        }

        while (todos.hasMoreElements()) {
        todo =  (ToDo) todos.nextElement();
        String todoInfo = null;
        try {
        todoInfo = todo.getString(ToDo.SUMMARY, PIMItem.ATTR_NONE);

        } catch (Exception ex) {
        showAlert("Info",ex.getMessage());
        continue;
        }
        if (todoInfo != null) {
        listTodos.append(todoInfo, null);
        }          
        }
        }

        /**
        * Checks PIM support.
        * @return - true if PIM is supported, false otherwise.
        */

        private boolean checkPIMSupport() {
        String propValue = System.getProperty("microedition.pim.version");
        if(propValue != null) {
        return true;
        } else {
        return false;
        }
        }



        private void getToDoList() {
        listToDos();
        aDisplay.setCurrent(listTodos);
        }

        /**
        * Adds ToDo to list of ToDos.
        * Gets data for ToDo from addToDoForm controls.
        */
        private void addToDo() {

        try {

        // Get list of ToDos.
        todoList = (ToDoList)PIM.getInstance().openPIMList(
        PIM.TODO_LIST, PIM.READ_WRITE);

        // Create new ToDo.
        todo = todoList.createToDo();

        // Get data from controls
        if(todoList.isSupportedField(ToDo.SUMMARY) == true) {

        if(summaryField.size()==0){

        showAlert("Info", "Summary missing, please enter a summary");
        return;
        }
        String summary =summaryField.getString();
        todo.addString(ToDo.SUMMARY, PIMItem.ATTR_NONE, summary);
        } else {
        // At least summary must be supported.
        closeToDoList();
        showAlert("Info", "Summary field for ToDo is not supported");
        }

        if(todoList.isSupportedField(ToDo.DUE) == true) {
        long startDate = dueDateField.getDate().getTime();
        todo.addDate(ToDo.DUE, PIMItem.ATTR_NONE, startDate);
        }   

        if(todoList.isSupportedField(ToDo.NOTE) == true) {
        String note = noteField.getString();
        todo.addString(ToDo.NOTE, PIMItem.ATTR_NONE, note);
        }

        if(todoList.isSupportedField(ToDo.PRIORITY) == true) {

        if(priorityField.size()==0){

        showAlert("Info", "Priority is missing, please enter a priority");
        return;
        }

        else {

            String  location = priorityField.getString();
            int i=Integer.parseInt(location);              

            if(i > 9){

            showAlert("Info","Priority exceeded, please enter a priority between 0-9");
                    return;
            }                

            todo.addInt(ToDo.PRIORITY, PIMItem.ATTR_NONE, i);           
        }
        }

        // Commit ToDo.
        todo.commit();

        // Notify user that ToDo was added
        showAlert("Info", "ToDo was successfully added");  

        } catch(PIMException pimExc) {
        // TODO: Handle error on working with PIM.
        showAlert("Info", pimExc.getMessage());
        }
        catch(SecurityException secExc) {
        // TODO: Handle error on access to PIM.
        showAlert("Info", secExc.getMessage());
        }

        catch(Exception exc) {

        // TODO: Handle all other errors.
        showAlert("Info", exc.toString());

        }

        }

        /**
        * Shows alert with specified title and text.
        * @param title - Title of alert.
        * @param message - text of alert.
        */
        private void showAlert(String title, String message) {
        Alert alert = new Alert(title);
        alert.setString(message);
        alert.setTimeout(2000);
        aDisplay.setCurrent(alert);
        }

        /**
        * From MIDlet.
        * Signals the MIDlet that it has entered the Active state.
        */


        public void startApp () { 
        aDisplay = Display.getDisplay (this); 
        aDisplay.setCurrent (aform); 


        } 

        public void pauseApp () { 
        } 

        public void destroyApp (boolean unconditional) {

        } 
        private void exitMIDlet() {
        notifyDestroyed();
        }

        private void closeToDoList() {
        if (todoList != null) {
        try {

        todoList.close();
        } catch (PIMException ex) {
        showAlert("Info","Error in closing ToDo list: "+ex.toString());
        }
        }
        todoList = null;
        }
        public void commandAction (Command c, Displayable d) { 

        if (c == exitCommand) { 
        destroyApp (false); 
        notifyDestroyed (); 
        } 
        if(c == backCommand){ 
        aDisplay.setCurrent(aform);
        } 
        }

        public void commandAction (Command c, Item i) { 

        if (c == hllinkCommand) { 
        aDisplay.setCurrent (hlAlert, aform); 
        } 
        if (c == b1Command) { 
        aDisplay.setCurrent (b1Alert, aform); 
        }
        if (c == b2Command){
        aDisplay.setCurrent (addToDoForm);
        }

        } 
        }

您的即時錯誤 - 這是您所有問題中最輕微的錯誤 - 是您忘記在commandAction(Command, Displayable)處理okCommand

因此,當用戶單擊“確定”時,沒有任何反應 - 只是因為沒有代碼可以處理這個問題。

這個錯誤很容易修復 - 只需添加到commandAction - 進入處理Displayable而不是Item的代碼 - 代碼如下,你就完成了:

        if(c == okCommand){ 
            // show whatever screen you need
            aDisplay.setCurrent(new Form("whatever"));
        } 

但這並不會結束你的麻煩,因為有了這樣的代碼你就會注定要犯下微妙的錯誤,並打破這些麻煩。

現在,我們正在與次要的事情做了,首先你的的錯誤是沒有記錄的,在用戶操作的點,內catch塊(為什么我提到catch塊,搜索網頁的東西像Java吞下例外 )。

這使得在調試時不必要地計算出那里發生了什么。 像上面的okCommand錯過處理這樣的錯誤很容易通過簡單地運行MIDlet並查看模擬器控制台(如果有日志記錄)來查找。

我建議記錄的用戶操作點在commandAction和調用setCurrent 在開發時,隨意添加更多你認為需要的東西(如果你使用Canvas, keyPressed看起來也是一個很好的候選者)。

public class Log {
    // utility class to keep logging code in one place
    public static void log (String message) {
        System.out.println(message);
        // when debugging at real device, S.o.p above can be refactored
        //  - based on ideas like one used here (with Form.append):
        //    http://stackoverflow.com/questions/10649974
        //  - Another option would be to write log to RMS
        //    and use dedicated MIDlet to read it from there
        //  - If MIDlet has network connection, an option is
        //    to pass log messages over the network. Etc etc...
    }
}


// ... other classes...
    // ...
    catch (Exception e) {
        Log.log("unexpected exception: [" + e + "]");
    }

    // ...
    public void commandAction(Command c, Displayable s) {
        Log.log("command: [" + c.getCommandLabel()
                + "] at screen: [" + d.getTitle() + "]");
        // ...
    }

    // ...
    public void commandAction(Command c, Item i) {
        Log.log("command: [" + c.getCommandLabel()
                + "] at item: [" + i.getLabel() + "]");
        // ...
    }

    // ...
    Log.log("set current: [" + someDisplayable.getTitle() + "]");
    display.setCurrent(someDisplayable);
    // ...

    protected void keyPressed(int key) { // in Canvas
        Log.log("key pressed: [" + getKeyName(key) + "]");
        // ...
    }

你的代碼中另一個非常糟糕的錯誤是它是一個神的對象 這使得修改和調試變得不必要地困難。 將您的應用程序拆分為較小的類,沒有必要將它們全部保存在一個地方。

首先,考慮將CommandListener和ItemCommandListener移動到單獨的類中,而不是讓MainMidlet實現這些。 請記住,可能有多個Item / CommandListener,例如每個屏幕一個。

將與aform內容相關的代碼拆分為單獨的類。 與bform,addToDoForm,listTodos相同。 等等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM