J2ME button command not working

会有一股神秘感。 提交于 2019-12-24 15:34:53

问题


I'm currently working on an j2me application and I'm having a hard time dealing with command button. Can someone please help me. The button was suppose to direct in a second form but when I click it, it's not working. Here's my code:

        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);
        }

        } 
        }

回答1:


Your immediate mistake - and that is the most minor of all your issues - is that you forgot to handle okCommand in the commandAction(Command, Displayable).

As a result, when user clicks OK, nothing happens - simply because there's no code to handle this.

This mistake is easy to fix - just add into commandAction - into the one that deals with Displayable not Item - code like below, and you're done:

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

But this will not end your troubles, because with code like this you're effectively doomed to make subtle mistakes and break your head fixing these.

Now that we're done with minor thing, first of your bad mistakes is lack of logging at the points of user actions and within catch blocks (for why I mention catch blocks, search Web for something like Java swallow exceptions).

This makes it unnecessarily difficult to figure what's going on there when you debug. Bugs like missing handling of okCommand above would be quite easy to find out by simply running MIDlet and looking into emulator console if there was logging there.

Points of user actions where I'd recommend logging are within commandAction and when invoking setCurrent. When developing, feel free to add more where you feel the need to (if you use Canvas, keyPressed looks like a good candidate for that, too).

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) + "]");
        // ...
    }

Another really really bad mistake in your code is that it's a God object. This makes it unnecessarily difficult to modify and debug. Split your application to smaller classes, there is no real need to keep it all in one place.

For a start, consider moving CommandListener and ItemCommandListener into separate classes instead of making MainMidlet implement these. Keep in mind that there could be more than one Item/CommandListener, eg one per each screen.

Split the code that is related to contents of aform into a separate class. Same to bform, addToDoForm, listTodos. Etc etc.



来源:https://stackoverflow.com/questions/12166934/j2me-button-command-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!