переменная не может быть разрешена - PullRequest
1 голос
/ 01 декабря 2011

Я работаю над книгой «Начало разработки BlackBerry 7» и действительно прикладываю свои маленькие или несуществующие навыки работы с oop / java к тест-затмению, которое выдает ошибку из кода в книге о том, что loginhandler не был объявлен - и да, это правильно - он не был объявлен, но он также не был объявлен в книге.

Что было сделано, так это внутренний класс, называемый logincommandhandler (внизу моего кода), который можно увидеть в выдержке здесь - http://my.safaribooksonline.com/book/-/9781430230151/chapter-4-user-interface-basics/67 - это то, что он должен вызывать (я полагаю), но мои ограниченные навыки я не знаю, каким должен быть loginHandler - должен ли он быть где-то определен с типом?

(для книги нет эрат)

package com.beginningblackberry.uifun;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.HorizontalFieldManager;

import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.component.PasswordEditField;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.component.LabelField;

import net.rim.device.api.ui.component.CheckboxField;
import net.rim.device.api.ui.component.ObjectChoiceField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.FieldChangeListener;

import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.util.StringProvider;

import net.rim.device.api.command.Command;
import net.rim.device.api.command.CommandHandler;
import net.rim.device.api.command.ReadOnlyCommandMetadata;

public class UiFunMainScreen extends MainScreen implements FieldChangeListener {

    BitmapField img;
    EditField usernameField;
    PasswordEditField passwordField;
    ObjectChoiceField domainField;
    CheckboxField rememberCheckBox;
    ButtonField clearButton, loginButton;

    public UiFunMainScreen(){
        Bitmap logoBitmap = Bitmap.getBitmapResource("img/upd8rLOGO.png");


        img = new BitmapField(logoBitmap, Field.FIELD_HCENTER);     
        add(img);
        add(new SeparatorField());
        add(new LabelField("Please Enter Your Credentials:"));



        usernameField = new EditField("Username:","");
        passwordField = new PasswordEditField("Password:","");
        domainField = new ObjectChoiceField("Domain",new String[] {"Home","Work"});
        rememberCheckBox = new CheckboxField("Remember password",false);
        add(usernameField);add(passwordField);
        add(domainField);
        add(rememberCheckBox);

        add(new SeparatorField());
        clearButton = new ButtonField("Clear",ButtonField.CONSUME_CLICK);
        loginButton = new ButtonField("Login",ButtonField.CONSUME_CLICK);

        HorizontalFieldManager buttonManager = new HorizontalFieldManager(Field.FIELD_RIGHT);
        buttonManager.add(clearButton);
        buttonManager.add(loginButton);

        add(buttonManager);

        clearButton.setChangeListener(this);
        //loginButton.setChangeListener(this);
        loginButton.setCommand(new Command(LoginHandler));


    }
    //routing
    public void fieldChanged(Field field, int context){

        if(field == clearButton){
            clearTextFields();
        }else if(field == loginButton){
            login();
        }
    }


    private void login(){
        if(usernameField.getTextLength()== 0 || passwordField.getTextLength() == 0){
            Dialog.alert("You must enter a username and password");
        }
        else
        {
            String username = usernameField.getText();
            String selectedDomain = (String) domainField.getChoice(domainField.getSelectedIndex());
            LoginSuccessScreen loginSuccessScreen = new LoginSuccessScreen(username, selectedDomain);
            UiApplication.getUiApplication().pushScreen(loginSuccessScreen);
        }

    }
    public void clearTextFields ()
    {
        usernameField.setText("");
        passwordField.setText("");

    }
    protected void makeMenu(Menu menu, int instance){
        super.makeMenu(menu, instance);
        /*
        menu.add(new MenuItem(new StringProvider("Login"),20,10){

            public void run(){
                login();
            }   
        });
        */

        //login menu item       
        MenuItem loginMenu = new MenuItem(new StringProvider("Login"),20,10);
        loginMenu.setCommand(new Command(LoginHandler));
        menu.add(loginMenu);


        //clear text menu item
        menu.add(new MenuItem(new StringProvider("Clear"),20,10){
            public void run(){
                clearTextFields();
            }   
        });
    }

    class LoginCommandHandler extends CommandHandler
    {

        public void execute(ReadOnlyCommandMetadata metadata, Object context){
            login();
        }
    }


}

и ошибка -

LoginHandler cannot be resolved to a variable   UiFunMainScreen.java    /UiFun/src/com/beginningblackberry/uifun    line 69 Java Problem

какие-нибудь волшебники blackberry / java проливают свет на то, где я ошибаюсь?

Обновление

Никто на самом деле не ответил на вопрос, чтобы позвонить в новый внутренний класс, который я назвал вместо этого

MenuItem loginMenu = new MenuItem(new StringProvider("Login"),20,10);
loginMenu.setCommand(new Command(new LoginCommandHandler()));
menu.add(loginMenu);

обновление 2 секунды ответа

Объявление loginHandler как переменной класса также работает -

LoginCommandHandler loginHandler = new LoginCommandHandler();

Ответы [ 4 ]

2 голосов
/ 01 декабря 2011

В вашем коде отсутствует эта строка

 LoginCommandHandler loginHandler = new LoginCommandHandler();

Более того, вы можете получить код для книги здесь .

2 голосов
/ 01 декабря 2011

Я думаю, это должен быть экземпляр LoginCommandHandler (класс, объявленный в конце). Это предположение, но образованное: конструктор Command ожидает экземпляр CommandHandler, а LoginCommandHandler расширяет CommandHandler, поэтому ...

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

loginButton.setCommand(new Command(LoginHandler));

до:

loginButton.setCommand(new Command(new LoginCommandHandler()));

Например, мы вызываем конструктор LoginCommandHandler и передаем полученный объект в new Command().

Или, если по какой-то причине (я действительно не читал код) вам нужна ссылка на обработчик, объявите и создайте его экземпляр:

LoginCommandHandler loginHandler = new LoginCommandHandler();

... а затем используйте его

loginButton.setCommand(new Command(loginHandler));

(Обратите внимание, что в указанном коде есть несколько мест, где они допустили эту ошибку.)

0 голосов
/ 01 декабря 2011

Проблема в этой строке

loginButton.setCommand(new Command(LoginHandler));

Вероятно, вам нужен экземпляр LoginHandler (новый LoginHandler ()) для перехода к новому методу Command.

0 голосов
/ 01 декабря 2011

Как указывает ошибка, ошибка находится в строке 69, и я предполагаю, что это:

 loginButton.setCommand(new Command(LoginHandler));

Предполагая, что LoginHandler является именем класса или интерфейса, эта строка недопустима.Это должно быть что-то вроде new Command(LoginHandler.class), new Command(new LoginHandler()) или, может быть, new Command("LoginHandler"), поскольку параметр требует, чтобы вы передавали объект (тип объекта для класса будет <classname>.class).

Если это такесли переменная, то она просто не существует (кстати, соглашение Java о том, что имена переменных начинаются со строчной буквы), и вы должны создать ее.

... это не имеетбыл объявлен, но он также не был объявлен в книге.... (для книги нет эрат)

Это не означает, что код в книге на 100% правильный и компилируемый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...