2011-12-01 4 views
1

저는 BlackBerry 7 개발 시작과 함께 실제로 작거나 존재하지 않는 oop/java 기술을 테스트 환경에 적용하여 책의 코드에서 loginhandler 선언되지 않았습니다. 그렇습니다. 올바른 것입니다. 선언되지 않았지만 책에서도 선언되지 않았습니다.변수를 확인할 수 없습니다.

여기 - 발췌에서 http://my.safaribooksonline.com/book/-/9781430230151/chapter-4-user-interface-basics/67을 볼 수있다 (내 코드의 맨 아래에) 내부 클래스라는 logincommandhandler입니다 완료되었습니다 무엇 -이 자사의 호출 (내가 생각)하지만 내 제한 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 

모든 블랙 베리/자바 마법사 내가 잘못 가고 위치에 도움이 되거 (어떤 책에 대한 erata 없음)?

업데이트 아무도 정말 온 내가이라는 새로운 내부 클래스를 호출하는 질문 강타 대답하지

대신

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

업데이트로 loginHandler 선언 이초 대답

클래스 변수도 작동 -

LoginCommandHandler loginHandler = new LoginCommandHandler(); 
+0

http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/command/Command.html – Azodious

답변

2

내 생각 엔이 클래스는 LoginCommandHandler (끝에서 선언 된 클래스)의 인스턴스 여야합니다.

쉬운 변화는 다음과 같이 모든 장소를 변경하는 것입니다 ... Command의 생성자가 CommandHandler 인스턴스를 기대하고 LoginCommandHandlerCommandHandler를 확장, 그래서 : 그것은 추측하지만, 교육을 하나의

loginButton.setCommand(new Command(LoginHandler)); 

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

예, 우리는 LoginCommandHandler 생성자를 호출하고 new Command()에 결과 객체를 전달하는 님의

.

또는 어떤 이유로 (내가 정말 코드를 읽지 않은) 당신은 핸들러에 대한 참조를 필요로하는 경우, 선언하고 인스턴스화 :

LoginCommandHandler loginHandler = new LoginCommandHandler(); 

을 ... 그리고 사용이

loginButton.setCommand(new Command(loginHandler)); 

(인용 부호가있는 코드에서 실수를 저지른 곳이 여러 곳 있습니다.이 라인이 유효,

loginButton.setCommand(new Command(LoginHandler)); 

LoginHandler 가정하면 클래스 또는 인터페이스의 이름입니다 오류가 나타난 바와 같이)

+0

허용! 귀하의 답변을 업데이트 할 때 내 질문을 업데이 트 - 덕분에 ... –

+0

+1에 대한 완전한 대답 :) – mprabhat

0

, 오류가 내가 생각하는 라인 69에있는 것은 이것이다. 매개 변수가 객체를 전달해야하므로 (예 : <classname>.class) new Command(LoginHandler.class), new Command(new LoginHandler()) 또는 new Command("LoginHandler")과 같아야합니다.

변수가되어야하는 경우 단순히 존재하지 않습니다 (Java 규칙은 변수 이름이 소문자로 시작한다는 것입니다).

... 선언되지 않았지만이 책에서 선언되지 않았습니다. ... (책에 대한 에라타 없음)

이것은 책의 코드가 100 % 정확하고 편집 가능하다는 것을 의미하지 않습니다.

0

문제는 당신이 proabably 새로운 명령 방법에 전달할 LoginHandler (새 LoginHandler())의 인스턴스를 필요로이 라인

loginButton.setCommand(new Command(LoginHandler)); 

입니다.

2

코드는 또한이 책 here에 대한 코드를 얻을 수있는이 라인을

LoginCommandHandler loginHandler = new LoginCommandHandler(); 

없습니다.

+0

이 올바른 또한 - 코드는 변수를 가지고있는 동안 책은 ... –

+0

+1 소스 코드 링크. "누락 된 줄"은'loginHandler'보다는'LoginHandler'를 사용했기 때문에 완전한 대답은 아니지만, 어이 ... –

관련 문제