gpt4 book ai didi

java - J2ME 按钮命令不起作用

转载 作者:行者123 更新时间:2023-11-29 05:55:51 25 4
gpt4 key购买 nike

我目前正在开发一个 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 block 内缺少日志记录(为什么我提及 catch block ,在 Web 上搜索类似 Java swallow exceptions 的内容。

这使得在调试时弄清楚那里发生了什么变得不必要地困难。通过简单地运行 MIDlet 并查看仿真器控制台(如果那里有日志记录),可以很容易地找到上面缺少 okCommand 处理的错误。

我建议记录的用户操作点位于 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 相同。等等等等

关于java - J2ME 按钮命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com