我在GWT中有一个带有几个“编辑”按钮的页面。我添加了一个登录对话框。默认情况下,该按钮被禁用。
我想要做的是仅在用户登录后启用按钮。
此外,只要我在if子句中放入多个运算符,它就会停止工作。如果我只放loggedIn = true
,那么它可以工作(我的意思是它超出了if子句并继续)。
我正在使用全局布尔变量:
Boolean loggedIn = false;
以下是我的工作:
public void login(final VerticalPanel vp, final RootPanel rp) {
final DialogBox db = new DialogBox();
db.setAnimationEnabled(true);
db.setGlassEnabled(true);
final VerticalPanel vp0 = new VerticalPanel();
vp0.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
vp0.setWidth("100%");
final HTML loginLabel = new HTML("Login:");
loginLabel.setStyleName("h1");
final FlexTable ft0 = new FlexTable();
final FlexCellFormatter cf = ft0.getFlexCellFormatter();
ft0.setCellSpacing(10);
ft0.setHTML(0, 0, "Login:");
cf.setStyleName(0, 0, "h3");
cf.setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);
final TextBox loginBox = new TextBox();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
loginBox.setFocus(true);
}
});
ft0.setWidget(0, 1, loginBox);
ft0.setHTML(1, 0, "Password:");
cf.setStyleName(1, 0, "h3");
cf.setAlignment(1, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);
final PasswordTextBox passwordBox = new PasswordTextBox();
ft0.setWidget(1, 1, passwordBox);
final Button loginButton = new Button(
"Login", new ClickHandler() {
public void onClick(ClickEvent event) {
if ((loginBox.getText() == "1234") && passwordBox.getText() == "1234") {
final HTML loginSuccessMsg = new HTML("Logged in. Please wait...");
db.add(loginSuccessMsg);
loggedIn = true;
db.hide();
rp.clear();
rp.add(vp);
}
else {
final HTML loginErrorMsg = new HTML("Username/Password incorrect! Try again.");
db.add(loginErrorMsg);
}
}
}
);
passwordBox.addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (((int)event.getCharCode()) == 13) {
loginButton.click();
}
}
});
ft0.setWidget(2, 0, loginButton);
cf.setColSpan(2, 0, 2);
cf.setAlignment(2, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
vp0.add(ft0);
db.add(vp0);
int left = Window.getClientWidth() / 3;
int top = Window.getClientHeight() / 3;
db.setPopupPosition(left, top);
db.show();
//vp.add(vp0);
}
这是登录方式。
这是我使用loggedIn
变量的地方:
if (loggedIn) butTotalNumQuick.setEnabled(true); else butTotalNumQuick.setEnabled(false);
此外,还有一些细节 - 默认情况下,此按钮处于禁用状态,因此可以使用。
我认为问题在于登录后需要刷新页面(面板)。这是我试图用
做的rp.clear();
rp.add(vp);
其中rp
为RootPanel
答案 0 :(得分:0)
您应该关注以下几点:
Boolean loggedIn = false;
为什么使用布尔对象?如果没有特殊原因,我没有考虑,那么使用原始类型。
此外,你不应该使用全局,这与oo原则相矛盾。特别是当变量代表一个状态时。重新设计您的应用程序,您可以访问所需的变量。如果您需要帮助,请询问或查看一些教程。
if ((loginBox.getText() == "1234") && passwordBox.getText() == "1234")
第三,不要在应用程序的客户端保存密码。从JavaScript中读出它们然后闯入你的应用程序并不难。
如果您的登录程序只是某个服务器通信的占位符,您希望稍后添加,那么您也遇到了一个新问题。此通信可能是异步的,如果您设计应用程序,则必须牢记这一点。
此外,您最后一段代码段可以合并到:
butTotalNumQuick.setEnabled(loggedIn)
答案 1 :(得分:0)
您的错误是rp.add(vp);
添加了您刚刚删除的vp
if (loggedIn) butTotalNumQuick.setEnabled(true); else butTotalNumQuick.setEnabled(false);
永远不会打电话给。更简单的方法是从ClickHandler内部访问您的按钮,并为butTotalNumQuick按钮设置Global变量。无需在login()
方法中将vp和rp作为参数发送。
示例:
private Button butTotalNumQuick = new Button();
...
public void login() {
...
if ((loginBox.getText() == "1234") && passwordBox.getText() == "1234") {
final HTML loginSuccessMsg = new HTML("Logged in. Please wait...");
db.add(loginSuccessMsg);
loggedIn = true;
butTotalNumQuick.setEnabled(loggedIn)
}
}