кнопка ок не работает

Пожалуйста, взгляните на следующий код.

Здесь кнопка "ОК" не отвечает.

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

public class TexyFieldExample extends MIDlet implements CommandListener
{
    private Form form;
    private Display display;
    private TextField name, company;
    private Command ok;

    public TexyFieldExample()
    {        
        name = new TextField("Name","",30,TextField.ANY);
        company = new TextField("Company","",30,TextField.ANY);
        ok = new Command("OK",Command.OK,2);

    }

    public void startApp()
    {
        form = new Form("Text Field Example");
        display = Display.getDisplay(this);

        form.append(name);
        form.append(company);
        form.addCommand(ok);

        display.setCurrent(form);

    }

    public void pauseApp()
    {

    }

    public void destroyApp(boolean destroy)
    {
        notifyDestroyed();
    }

    public void commandAction(Command c, Displayable d) 
    {
        String label = c.getLabel();

        if(label.equals("ok"))
        {
            showInput();
        }
    }

    private void showInput()
    {
        form = new Form("Input Data");
        display = Display.getDisplay(this);

        form.append(name.getString());
        form.append(company.getString());

        display.setCurrent(form);

    }
}

person JustCause    schedule 03.08.2012    source источник


Ответы (1)


В этом фрагменте кода commandAction не будет вызываться, поскольку вы забыли setCommandListener:

Устанавливает прослушиватель команд для этого отображаемого объекта...

В startApp это будет выглядеть примерно так:

    //...
    form.addCommand(ok);
    // set command listener
    form.setCommandListener(this);
    //...

Кроме того, как указано в другом ответе, даже после того, как вы установите прослушиватель, он пропустит команду, потому что код проверяет ее неправильно - в Java "ok" не равно "OK".

На самом деле, учитывая, что здесь только одна команда, нет необходимости проверять действие commandAction — вы можете перейти прямо туда showInput — снова, пока не будет только одна команда.


Еще одна вещь, которую стоит добавить в этот фрагмент кода, — это ведение журнала.

При соответствующем ведении журнала было бы очень легко просто запустить код в эмуляторе, заглянуть в консоль и узнать, что, например, commandAction вообще не вызывается или эта команда не обнаружена должным образом:

// ...
public void commandAction(Command c, Displayable d) 
{
    String label = c.getLabel();
    // log the event details; note Displayable.getTitle is available since MIDP 2.0
    log("command  s [" + label + "], screen is [" + d.getTitle() + "]");

    if(label.equals("ok"))
    {
        // log detection of the command
        log("command obtained, showing input");
        showInput();
    }
}

private void log(String message)
{
    // show message in emulator console
    System.out.println(message);
}
// ...
person gnat    schedule 03.08.2012
comment
Точнее, ему нужно сделать ok.setCommandListener(this);, чтобы получить желаемое поведение. - person kurtzbot; 03.08.2012
comment
@kurtzbot: хорошо, у кнопки нет таких методов. Я проверил это. - person JustCause; 04.08.2012