有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无法解析java变量

我正在阅读《BlackBerry 7开发入门》一书,并真正测试了我的一点或根本不存在的oop/java技能——eclipse在书中的代码中抛出了一个错误,指出loginhandler尚未声明——是的,它是正确的——它尚未声明,但也未在书中声明

所做的是一个名为logincommandhandler的内部类(在我的代码底部),可以在这里的摘录中看到-http://my.safaribooksonline.com/book/-/9781430230151/chapter-4-user-interface-basics/67-这就是它要调用的(我假设),但我有限的oop技能我不知道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

任何黑莓/java向导都能说明我错在哪里

更新

没有人真正回答了这个问题——我把这个叫做新的内部类

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

更新第二个答案

将loginHandler声明为类变量也有效-

LoginCommandHandler loginHandler = new LoginCommandHandler();

共 (4) 个答案

  1. # 1 楼答案

    您的代码缺少这一行

     LoginCommandHandler loginHandler = new LoginCommandHandler();
    

    此外,您还可以获得here这本书的代码

  2. # 2 楼答案

    问题就在这方面

    loginButton.setCommand(new Command(LoginHandler));
    

    您可能需要一个LoginHandler实例(new LoginHandler())来传递给新的命令方法

  3. # 3 楼答案

    我猜想它应该是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));
    

    (请注意,在引用的代码中有多个地方他们犯了这个错误。)

  4. # 4 楼答案

    如错误所示,错误在第69行,我假设是:

     loginButton.setCommand(new Command(LoginHandler));
    

    假设LoginHandler是类或接口的名称,则此行无效。 它应该类似于new Command(LoginHandler.class)new Command(new LoginHandler())或者new Command("LoginHandler"),因为参数要求您传递一个对象(类的类型对象应该是<classname>.class

    如果它应该是一个变量,那么它就根本不存在(顺便说一句,Java的惯例是变量名以小写字母开头),您必须创建它

    ... it hasn't been declared but it also hasn't been declared in the book. ... (there is no erata for the book)

    这并不意味着书中的代码是100%正确和可编译的