Java me 如何使用j2me画布从用户处获取输入?这可能吗?

Java me 如何使用j2me画布从用户处获取输入?这可能吗?,java-me,textinput,midp,lcdui,Java Me,Textinput,Midp,Lcdui,我目前正在尝试学习J2ME并构建一个connect-four游戏(你们中的一些人可能知道这是“四连环”)。除了一件让我发疯的事情外,我的游戏的所有方面都或多或少地发挥了作用!这当然是从用户那里获取文本 对于游戏的双人模式,我希望能够允许每个玩家输入他们的名字。我正在努力寻找一个不使用主Midlet的文本输入工作示例 例如,上面的示例只使用一个midlet(没有类、画布或任何东西) 目前,我的应用程序的主midlet start方法只需打开一个主菜单类: package midlet;

我目前正在尝试学习J2ME并构建一个connect-four游戏(你们中的一些人可能知道这是“四连环”)。除了一件让我发疯的事情外,我的游戏的所有方面都或多或少地发挥了作用!这当然是从用户那里获取文本

对于游戏的双人模式,我希望能够允许每个玩家输入他们的名字。我正在努力寻找一个不使用主Midlet的文本输入工作示例

例如,上面的示例只使用一个midlet(没有类、画布或任何东西)

目前,我的应用程序的主midlet start方法只需打开一个主菜单类:

    package midlet;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import view.*;

public class Main extends MIDlet {
    public void startApp() { 
        MainMenu mm = new MainMenu();
        showScreen(mm);
    }

    public static void showScreen(Displayable screen) {
        Display.getDisplay(instance).setCurrent(screen);
    }

    public void pauseApp() {
    }

    public static void quitApp() {
        instance.notifyDestroyed();
    }

    public void destroyApp(boolean unconditional) {
    }
}
主菜单类如下所示:

 package view;

    import javax.microedition.lcdui.*;
    import lang.*;
    import model.*;
    import midlet.Main;

    public class MainMenu extends List implements CommandListener {

        private Command ok = new Command(StringDefs.currDefs.getString("TEXT_OK"), Command.OK, 1);

        public MainMenu() {
            super(StringDefs.currDefs.getString("TEXT_TITLE"), List.IMPLICIT);
            // we we add in the menu items
            append(StringDefs.currDefs.getString("TEXT_PLAY1"), null);
            append(StringDefs.currDefs.getString("TEXT_PLAY2"), null);
            append(StringDefs.currDefs.getString("TEXT_HIGHSCORETABLE"), null);
            append(StringDefs.currDefs.getString("TEXT_HELP"), null);
            append(StringDefs.currDefs.getString("TEXT_QUIT"), null);
            this.addCommand(ok);
            this.setCommandListener(this);
        }

        public void commandAction(Command c, Displayable d) {
            if (c == ok) {
                int selectedItem = this.getSelectedIndex();
                if (selectedItem != -1) {
                    switch (selectedItem) {
                        case 0:
                            GameBoard gameBoard = new model.GameBoard();
                            GameCanvasOnePlayer board = new GameCanvasOnePlayer(gameBoard);
                            Main.showScreen(board);
                            break;
                        case 1:
                            GameBoard gameBoardTwo = new model.GameBoard();
                            GameCanvasTwoPlayer GameCanvasTwoPlayer = new GameCanvasTwoPlayer(gameBoardTwo);
                            Main.showScreen(GameCanvasTwoPlayer);
                            break;
                        case 2:
                            HighScores hc = new HighScores();
                            midlet.Main.showScreen(hc);
                            break;
                        case 3:
                            Help he = new Help();
                            midlet.Main.showScreen(he);
                            break;
                        case 4:
                            QuitConfirmation qc = new QuitConfirmation();
                            midlet.Main.showScreen(qc);
                            break 
                    }
                }
            }
        }
    }
当从该菜单中选择一个双人游戏(上述开关中的案例1)时,我希望显示两个文本框,以便我可以获取两个玩家的姓名并存储它们


最好的办法是什么?这在画布上是可能的吗?你知道我在哪里可以找到一个相关的例子或者至少是一些可能有用的东西吗?

这是一个非常棘手的问题。基本上,您需要使用J2ME的输入文本小部件(顺便说一句,它看起来很可怕)。如果你不这样做,你将不得不实现不同类型电话键盘背后的所有逻辑,你将无法访问字典。。。您的画布基本上只捕获击键,而不是文本输入

对不起。

您可以: 1.让用户在一个丑陋的窗口中输入他的输入(占据整个屏幕) 2.使用我很久以前从头开始编写的文本框控件,它是可用的 如下所示(显示3个文本字段):


我有一个解决办法!嗯,差不多

我可以在不使用主midlet的情况下创建表单:

以下主类是名为
midlet
的源程序包的一部分(与我的项目非常相似):

下一位代码是username表单类,它是名为
view
的源程序包的一部分:

package view;

import javax.microedition.lcdui.*;

public class UsernameForm extends Form implements CommandListener {
    private String username1="";
    private String username2="";
    private TextField tfUsername1=new javax.microedition.lcdui.TextField("User 1","User1",40,TextField.ANY);
    private TextField tfUsername2=new javax.microedition.lcdui.TextField("User 2","User2",40,TextField.ANY);
    private Command cmdOK=new Command("OK",Command.OK,1);
    public UsernameForm() {
        super("User details");
        append(tfUsername1);
        append(tfUsername2);
        addCommand(cmdOK);
        setCommandListener(this);
    }

public void commandAction(Command cmd,Displayable d) {
    if (cmd==cmdOK) {
        this.setUsername1(tfUsername1.getString());
        this.setUsername2(tfUsername2.getString());
        // TO DO, GO TO NEXT SCREEN
    }
}

/**
 * @return the username1
 */
public String getUsername1() {
    return username1;
}

/**
 * @param username1 the username1 to set
 */
public void setUsername1(String username1) {
    this.username1 = username1;
}

/**
 * @return the username2
 */
public String getUsername2() {
    return username2;
}

/**
 * @param username2 the username2 to set
 */
public void setUsername2(String username2) {
    this.username2 = username2;
}
}

因此,使用画布似乎没有简单的方法,我认为我最好使用“丑陋的表单”,因为它们应该在任何设备上工作。

在这里,您需要实现自定义项,您需要做的只是扩展画布的一部分,让用户/玩家在自定义项中输入自己的姓名,并实现自定义项预定义的抽象方法,以及键盘笔划的书写方法,这些都可以在诺基亚论坛上找到。他们解释得很好。查看诺基亚论坛。

嗯,这不太好,但我想知道这个很好!你没什么可遗憾的我非常感谢你的建议!那么,所有的j2me文本输入都是通过MIDlet完成的吗?是的,差不多。如果您使用黑莓(它是J2ME API的扩展),您可能可以使用自定义控件,但是使用J2ME,您需要打开一个输入文本屏幕,然后检索输入的文本。Re:“J2ME的输入文本小部件(顺便说一句,它看起来很可怕)”。根据设备自身的UI外观,每个设备上的外观都会有所不同。在特定的设备上它看起来是否可怕取决于观看者的眼睛;它可能不适合您自己的应用程序的UI,但它将是用户在手机UI中习惯的。谢谢!我已经快速浏览了您的解决方案,它应该会起作用!但正如ruibm所说,我最终需要实现不同类型手机键盘背后的所有逻辑。如果我不能解决这个问题,我可能不得不使用它!谢谢如果是为了一个游戏,也许你可以像这个家伙一样接受输入
package view;

import javax.microedition.lcdui.*;

public class UsernameForm extends Form implements CommandListener {
    private String username1="";
    private String username2="";
    private TextField tfUsername1=new javax.microedition.lcdui.TextField("User 1","User1",40,TextField.ANY);
    private TextField tfUsername2=new javax.microedition.lcdui.TextField("User 2","User2",40,TextField.ANY);
    private Command cmdOK=new Command("OK",Command.OK,1);
    public UsernameForm() {
        super("User details");
        append(tfUsername1);
        append(tfUsername2);
        addCommand(cmdOK);
        setCommandListener(this);
    }

public void commandAction(Command cmd,Displayable d) {
    if (cmd==cmdOK) {
        this.setUsername1(tfUsername1.getString());
        this.setUsername2(tfUsername2.getString());
        // TO DO, GO TO NEXT SCREEN
    }
}

/**
 * @return the username1
 */
public String getUsername1() {
    return username1;
}

/**
 * @param username1 the username1 to set
 */
public void setUsername1(String username1) {
    this.username1 = username1;
}

/**
 * @return the username2
 */
public String getUsername2() {
    return username2;
}

/**
 * @param username2 the username2 to set
 */
public void setUsername2(String username2) {
    this.username2 = username2;
}
}