2015-10-22 43 views
1

我在GWT中有一個頁面,帶有幾個「編輯」按鈕。我添加了一個登錄對話框。默認情況下,按鈕被禁用。當用戶登錄時啓用頁面上的按鈕/ 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); 

,因爲,那裏rpRootPanel

回答

0

你的錯誤是rp.add(vp);是增加你只是刪除了相同vp

if (loggedIn) butTotalNumQuick.setEnabled(true); else butTotalNumQuick.setEnabled(false); 

永遠不會被調用。更簡單的方法是從ClickHandler中訪問按鈕併爲butTotalNumQuick按鈕設置全局變量。不需要發送vp和rp作爲login()方法中的參數。

例子:

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) 
       } 
} 
0

有,你應該專注於多點:你爲什麼要使用Boolean對象

Boolean loggedIn = false; 

。如果沒有特別的理由,我不認爲,那麼使用原始類型。

此外,你不應該使用全局變量,這與oo原理相矛盾。特別是當一個變量代表一個狀態時。重新設計你的應用程序,你可以訪問你需要的變量。如果您需要幫助,請查看或查看一些教程。

if ((loginBox.getText() == "1234") && passwordBox.getText() == "1234") 

第三,不要在客戶端應用程序中保存密碼。從JavaScript中讀出它們並不難,然後進入你的應用程序。

如果您的登錄過程只是稍後要添加的某個服務器通信的佔位符,那麼您也會遇到一個新問題。這種溝通可能是異步的,如果你設計你的應用程序,你必須記住這一點。

而且你最後的代碼片段可以合併到:

butTotalNumQuick.setEnabled(loggedIn) 
+0

其實我要的是一個簡單的登錄,因爲只有一個用戶,我明白,最好將它移動到服務器端。你能推薦一些很好的教程嗎?我在網上搜索了很多,但沒有找到任何像樣的。 此外,我還有一個問題 - 我想有一種存儲。即,登錄的用戶在頁面上編輯smith,然後所有其他用戶(每個用戶都已加載自己的頁面)都可以看到該編輯。你能幫助解決這個問題嗎? –

+0

此外,當我鍵入布爾,它會給出錯誤「布爾不能解析爲一個類型」。這就是爲什麼我使用Boolean –

+0

@GeorgeSalukvadze如果您希望其他用戶查看編輯的信息,則必須將這些信息存儲在服務器端的某個位置,例如在數據庫中。而不是使用大寫字母B的布爾值。使用gwt或多或少可以理解的登錄教程:https://varuntayur.wordpress.com/2012/01/25/session-management-in-gwt/ – Tobika

相關問題