2014-12-20 9 views
2

在Java Swing桌面應用程序中。我有許多較小的類,所有這些都是在總體應用程序類中使用的。其中一個較小的類是代表我的登錄頁面的JPanel。我添加了一個MouseListener的這個頁面上的登錄按鈕,即進入這樣的:變量在同一範圍內調用時會產生多個值java

Public class loginPage extends JPanel{ 
String username; 
boolean capturedName=false; 
JTextField nameField; 

...

loginButton.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        username = nameField.getText(); 
        capturedName=true; //for redundant checking of mouse click event 
        System.out.println(username); //error checking 
        System.out.println(capturedName); //error checking 
       } 
      }); 
    } 

在此代表我的JFrame一個單獨的顯示類,我做的登錄頁面該類的一個屬性,我在我的應用程序類中添加登錄頁面後,實例化這個顯示類。我正在嘗試捕獲App類中的登錄頁面用戶名attr並將其傳遞給其他方法。但是,當我運行代碼並單擊登錄按鈕時,文本框中的值不會被捕獲。

出錯檢查,我試過FF:

//Set login page GUI up 

while(display.loginPage.username==null){ //this is initially true 

     if (display.loginPage.capturedName){ //boolean to check if button has been clicked 
      display.loginPage.username=display.loginPage.nameField.getText(); //intentional redundancy 
      String username=display.loginPage.username; 
      System.out.print(username); 
      //pass username to other methods 
     } 

     } 

當我運行的代碼,在用戶名文本框輸入一個名稱,並點擊登錄,輸入名稱和真實值的capturedName布爾是兩者都印有,但

if (display.loginPage.capturedName) 

條件從未滿足。另外,當我添加打印display.loginPage.username時,我得到一個空值。什麼可能是相同的值之間的這種差異的原因?

+1

對你的建議(與你的問題無關):類名「loginPage」不是一個好的選擇。將其重命名爲「LoginPage」。這是一個Java類約定,以大寫字母開頭,變量以小寫字母開頭。如果你遵循這個約定,你的代碼更容易讓其他人理解。 – EJK

+2

要獲得更好的幫助,請考慮創建併發布[最小,完整和可驗證示例程序](http://stackoverflow.com/help/mcve)。我們不希望看到你的整個程序,而是你應該將你的代碼壓縮到仍然編譯的最小的代碼中,沒有額外的代碼與你的問題無關,但仍然表明你的問題。順便說一句,你永遠不會想要像使用JButton一樣使用MouseListener。而是使用一個ActionListener,就像它爲其構建的那樣。 –

回答

4

一個登錄對話框/表格的一個例子可能是什麼這個差異的原因相同的值之間?

您可能有兩個相同類型的對象,一個顯示狀態正在更改,另一個沒有顯示您正在檢查if塊。

但是,爲了獲得更好的幫助,請考慮創建併發布Minimal, Complete, and Verifiable Example Program。我們不希望看到你的整個程序,而是你應該將你的代碼壓縮到仍然編譯的最小的代碼中,沒有額外的代碼與你的問題無關,但仍然表明你的問題。順便說一句,你永遠不會想要像使用JButton一樣使用MouseListener。而是使用一個ActionListener,就像它爲其構建的那樣。

+0

感謝您的回覆。我相信你是對的,因爲我可能正在處理兩個不同的LoginPage實例,但在我看來,我的代碼中沒有任何可以指出這種差異的地方。也許我錯了? –

3
  1. 「我已經加了的MouseListener的登錄按鈕」 - 不是一個好主意,按鈕應使用ActionListener,見How to Write an Action ListenersHow to Use Buttons, Check Boxes, and Radio Buttons;

  2. while(display.loginPage.username==null){是一個真正的,真的很壞的主意,它可能會鎖住你的用戶界面,並暗示你違反了Swing的單線程規則。有關更多詳細信息,請參見Concurrency in Swing

這聽起來像你需要的是一個模式對話框,它可以阻止在對話框可見該點的代碼的執行...

更多細節

How to Make Dialogs看看Java and GUI - Where do ActionListeners belong according to MVC pattern?使用MVC paridigm(Model-View-Controller

+0

我的歉意,我應該指出,我錯誤地引用登錄按鈕作爲一個按鈕。它起到了這個作用,但它實際上是一個JLabel,因爲我的同事實際上已經寫了這部分內容。與mouselisteners相同的問題是否適用於JLabels? –

+0

好吧,這會引發可用性問題,因爲並非所有用戶都可以使用鼠標或可以使用鼠標。但是,不,在這種情況下,MouseListener是您唯一的選擇(其他則使用正確的按鈕) – MadProgrammer

0

原因@MadProgrammer建議,我在我的顯示類中創建兩個不同的loginPage對象。然而,令人好奇的是,實際上可見的登錄頁面GUI上的mouselistener實際上已經被監聽,並返回了定義更好的登錄頁面對象(這是不可見的)的預期結果。

相關問題