Как мне получить входные данные от пользователя, использующего j2me canvases?возможно ли это вообще?

StackOverflow https://stackoverflow.com/questions/1975263

  •  21-09-2019
  •  | 
  •  

Вопрос

В настоящее время я пытаюсь изучить J2ME и создать игру connect four (некоторые из вас, возможно, знают ее как "четыре в ряд").У меня более или менее работают все аспекты моей игры, за исключением одной вещи, которая сводит меня с ума!Это, конечно, получение текста от пользователя!

Для режима игры с двумя игроками я хочу иметь возможность разрешить каждому игроку вводить свое имя.Я изо всех сил пытаюсь найти рабочий пример ввода текста, который не использует основной мидлет.

Например, примеры на java2x.com просто используйте один мидлет (без классов, холстов или чего-либо еще).

В нынешнем виде метод запуска основного мидлета моего приложения просто открывает класс главного меню:

    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 в приведенном выше переключателе), я бы хотел, чтобы появились два текстовых поля, чтобы я мог получить имена обоих игроков и сохранить их.

Каков был бы наилучший способ справиться с этим?возможно ли это вообще с холстами?И знаете ли вы, где я могу найти соответствующий пример или хотя бы что-то, что может помочь?

Это было полезно?

Решение

Вы можете либо:1.Заставьте пользователя ввести свой ввод в уродливом виде Текстовое поле (который занимает весь экран) 2.Используйте элемент управления textbox, который я давным-давно написал с нуля и который доступен здесь и выглядит примерно так (показано 3 текстовых поля):

alt text

Другие советы

У меня есть решение!ну типа того.

Я могу создать форму без использования основного мидлета:

Следующий основной класс является частью исходного пакета под названием midlet (как и в моем проекте):

package midlet;

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

public class Main extends MIDlet {
    private static UsernameForm unameForm=new UsernameForm();
    private static MIDlet instance;
    public void startApp() {
        instance=this;
        showScreen(unameForm); // show user name form

    }

    public static String getUsername1() {
        return(unameForm.getUsername1());
    }

    public static String getUsername2() {
        return(unameForm.getUsername2());
    }

    public void pauseApp() {
    }

    public static void showScreen(Displayable d) {
        Display.getDisplay(instance).setCurrent(d); // show next screen

    }

    public void destroyApp(boolean unconditional) {
    }
}

Следующий фрагмент кода — это класс формы имени пользователя, который является частью исходного пакета под названием 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 (который, кстати, выглядит ужасно).Если вы этого не сделаете, вам придется реализовать всю логику, лежащую в основе различных типов телефонных клавиатур, и у вас не будет доступа к словарю...Ваш холст будет в основном фиксировать нажатия клавиш, а не ввод текста...

Извини.

Здесь вам нужно реализовать пользовательские элементы, все, что вам нужно сделать, это расширить часть холста, где пользователь/игрок должен вводить свое имя в CustomItems, и реализовать предопределенные абстрактные методы customItems и написать метод. для нажатия клавиш, и это доступно на форуме Nokia.Они объяснили это довольно хорошо.Посетите форум Nokia.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top