2012-08-28 51 views
1

我目前正在研究j2me应用程序,而且我很难处理命令按钮。有人可以帮帮我吗。该按钮是假设在第二种形式,但是当我点击它,它不起作用。这里是我的代码: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-81" 
     , 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); 
     } 

     } 
     } 

回答

3

你眼前的错误 - 那就是你所有的问题最轻微的 - 是你忘记在commandAction(Command, Displayable)处理okCommand

因此,当用户点击确定时,没有任何反应 - 仅仅因为没有代码来处理这个问题。

这个错误很容易解决 - 只需添加到的commandAction - 成与可显示的项目不涉及的一个 - 这样的代码下面,你就大功告成了:

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

另一个真的很糟糕错在你的代码是,它是一个God object。这使得修改和调试不必要地困难。将应用程序拆分为更小的类,并不需要将它全部保存在一个地方。

首先,考虑将CommandListener和ItemCommandListener移动到单独的类中,而不是使MainMidlet实现这些。请记住,可能有多个Item/CommandListener,例如每个屏幕一个。

将与aform的内容相关的代码拆分为单独的类。与bform相同,addToDoForm,listTodos。等等。

+0

非常感谢您的先生。我学到了很多。我刚开始j2me和耶,这是一个很好的帮助! – drayl