3

次のコードは私に与え続けます:

別のメソッドLogin.java/ChurchWebLogin / src / com / gwt / churchweb / churchweblogin/client行61で定義された内部クラス内の非最終変数textBoxPasswordを参照できません

package com.gwt.churchweb.churchweblogin.client;

import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.user.client.Window;

public class Login extends Composite {

    public Login() {

        VerticalPanel verticalPanel = new VerticalPanel();
        initWidget(verticalPanel);
        verticalPanel.setSize("329px", "186px");

        Label lblNewLabel = new Label("Sign into your account");
        lblNewLabel.setStyleName("gwt-Login-SigninLabel");
        verticalPanel.add(lblNewLabel);

        FlexTable flexTable = new FlexTable();
        verticalPanel.add(flexTable);
        flexTable.setWidth("308px");

        Label lblNewLabel_1 = new Label("Username:");
        lblNewLabel_1.setStyleName("gwt-Label-Login");
        flexTable.setWidget(0, 0, lblNewLabel_1);
        lblNewLabel_1.setWidth("72px");

        TextBox textboxUsername = new TextBox();
        textboxUsername.setStyleName("gwt-LoginTextBox");
        flexTable.setWidget(0, 1, textboxUsername);
        textboxUsername.setWidth("204px");

        Label lblNewLabel_2 = new Label("Password:");
        lblNewLabel_2.setStyleName("gwt-Label-Login");
        flexTable.setWidget(1, 0, lblNewLabel_2);
        lblNewLabel_2.setWidth("66px");

        TextBox textBoxPassword = new TextBox();
        textBoxPassword.setStyleName("gwt-LoginTextBox");
        flexTable.setWidget(1, 1, textBoxPassword);
        textBoxPassword.setWidth("204px");
        flexTable.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT);
        flexTable.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_LEFT);

        CheckBox chckbxRememberMeOn = new CheckBox("Remember me on this computer");
        chckbxRememberMeOn.setStyleName("gwt-Checkbox-Login");
        flexTable.setWidget(2, 1, chckbxRememberMeOn);

        Button btnSignIn = new Button("Sign In");
        btnSignIn.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (textboxUsername.getText().length() == 0
                        || textBoxPassword.getText().length() == 0) {
                        Window.alert("Username or password is empty."); 
                    }
            }
        });

        btnSignIn.setStyleName("gwt-Login-SigninButton");
        flexTable.setWidget(3, 1, btnSignIn);



    }


}
4

3 に答える 3

6
final TextBox textboxUsername = new TextBox();

final TextBox textBoxPassword = new TextBox();

それを修正する必要があります。

Javaでは、内部クラスからの変数への参照が変数である必要がありfinalます(並行性管理の理由から、私は推測します)。

于 2012-06-03T00:29:31.877 に答える
4

finalローカル変数を内部クラスで使用する場合は、宣言する必要があります。あなたは書くべきです:

final TextBox textBoxPassword = new TextBox();
于 2012-06-03T00:34:14.847 に答える
2

匿名クラスインスタンスは、周囲のスコープのローカル変数とパラメータにアクセスできる必要があります。ただし、インスタンスは、(インスタンスの参照をフィールドに格納した結果として)想定されたメソッドよりも長生きし、メソッドが戻った後に存在しなくなったローカル変数とパラメーターにアクセスしようとする場合があります。

Javaは、仮想マシンをクラッシュさせる可能性が最も高いこの不正アクセスを許可できないため、匿名クラスインスタンスは、finalと宣言されたローカル変数とパラメーターにのみアクセスできます。匿名クラスインスタンスで最終的なローカル変数/パラメータ名に遭遇すると、コンパイラは次の2つのいずれかを実行します。

  • 変数の型がプリミティブ(たとえば、intまたはdouble)の場合、コンパイラーはその名前を変数の読み取り専用値に置き換えます。
  • 変数の型が参照(たとえば、文字列)の場合、コンパイラーは、クラスファイルに合成変数(製造変数)と、ローカル変数/パラメーターの参照を合成変数に格納するコードを導入します。
于 2012-10-17T11:55:00.990 に答える