2014-12-02 23 views
0

中指定的新值,因此我創建了一個名爲savedName的變量,然後將其值設置爲動作偵聽器方法中的新值。它將更改的值打印在動作偵聽器中,但僅在動作偵聽器中打印。似乎一旦動作偵聽器發生,變量的值就會變回「null」(默認值)。 username_txt是用戶輸入信息的文本字段。但正如我所說的那樣,只是在動作偵聽器方法中臨時更改該值,並且一旦動作偵聽器發生,它就會變回默認值。我用粗體顯示了savedName的語句。變量的值不會更改爲在actionListener

public class LoginWindow extends javax.swing.JFrame { 

    /** 
    * Creates new form LoginWindow 
    */ 
    Connection conn = null; 
    ResultSet rs = null; 
    PreparedStatement pst = null; 
    **private String savedName;** 
    public LoginWindow() { 
     initComponents(); 
     conn = JavaConnect.ConnecrDb(); 
    } 
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    String user_sql = "select * from Users where Username=? and Password=? "; 
    try{ 
     pst = conn.prepareStatement(user_sql); 
     pst.setString(1, username_txt.getText()); 
     savedName = username_txt.getText(); 
     System.out.println(savedName); 
     pst.setString(2, password_txt.getText()); 

     rs = pst.executeQuery(); 
     if(rs.next()){ 
      JOptionPane.showMessageDialog(null, "Wecome!"); 
      rs.close(); 
      pst.close(); 
      this.dispose(); 

      UserMainWindow wind = new UserMainWindow(); 
      wind.setVisible(true); 
     } 
     else{ 
      JOptionPane.showMessageDialog(null, "Username and/or Password is not correct"); 
     } 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null,e); 
    } 
    finally { 
     try{ 
     rs.close(); 
     pst.close(); 
     } 
     catch(Exception e){ 

     } 
    } 
}     
+0

您的操作偵聽器是一種私有方法。那應該是? – 2014-12-02 06:25:09

+0

你確定你的'jButton2ActionPerformed'方法已被調用嗎? – 2014-12-02 06:25:38

+0

該動作偵聽器是一個登錄按鈕。我在actionListener中做了System.out.println(savedName),它打印出正確的值。我需要另一個類的savedName變量,並且每當我在另一個類中使用savedName時,它總是使用savedName的默認值。該值在actionPerformed方法中暫時更改,但從不保存。 – user3754524 2014-12-02 06:28:46

回答

0

您是從其他類獲得空是因爲你正在創建一個新的對象而不是值傳遞到其他類。這可以通過在你的UserMainWindow類中加入一個構造函數並接受一個字符串來完成。 如果你已經有一個構造函數只是接受字符串作爲參數,併爲該字符串創建一個變量並設置它..

示例代碼:(注:這是UserMainWindow類)

private String savedName; 
public UserMainWindow(String savedName){ 
    this.savedName = savedName; 
} 
現在

中的類要創建這個對象,將它傳遞這樣的字符串:(這是你所創建的userMainWindow類類)

UserMainWindow wind = new UserMainWindow(savedName); 

現在你應該有saveName保存在你的其他框架(用戶主窗口)內,而其他框架被丟棄。

+0

這是有道理的。但我有非靜態變量不能從我的公共靜態無效主要靜態上下文錯誤引用。我明白爲什麼要這樣做,但有沒有辦法解決這個問題? – user3754524 2014-12-02 07:16:58

+0

在我的公共靜態無效主(字符串參數)我有UserMainWindow(savedName).setVisible(true)。這是給我的錯誤,因爲savedName是靜態的 – user3754524 2014-12-02 07:18:48

+0

其實我得到它的工作。我想我應該能夠將變量savedName更改爲其他類中的靜態,而不影響其他內容。它的工作!非常感謝!!! – user3754524 2014-12-02 07:21:47

0

注:我不能評論了我的想法,所以我剛剛張貼下面我來更新我的答案回答:)評論。

jButton2ActionPerformed之後會發生什麼?它會在LoginWindow班離開,然後去另一班嗎?如果是,那麼String savedName的值將返回null。

實例變量在類中聲明,但在方法外聲明。他們 也被稱爲成員或字段變量。當堆中的對象分配爲 時,每個實例變量值都有一個插槽。 因此,創建對象時創建實例變量 並在對象被銷燬時銷燬。在所有可見的方法和定義類的構造函數中,通常應該聲明爲 私有,但可能會給出更大的可見性。 click here.

這是我的建議。

第一:

創建具有的public static String savedName = "";

例如一個實例變量一類

package com.sample.classes; 
public class SampleClass { 
    public static String savedName = ""; 
} 

然後所有需要此變量的類必須在這種情況下象

public class Sample2 extends SampleClass{ 

     public void showUserName(){ 
     System.out.println(SampleClass.savedName); 
     } 

    } 

public class Sample1 extends SampleClass{ 
    public void pressThisButton (String username){ 
     SampleClass.savedName = username; 
    } 

} 

public static void main(String [] args){ 
    Sample1 press = new Sample1(); 
    // Populate the savedName variable 
    press.pressThisButton("My Name is Press"); 

    // access savedName variable. 
    new Sample2().showUserName(); 

} 

擴展它,你仍然可以使用savedName的,甚至你已經留在某一類的值。

,但即時通訊仍然不知道這:),只是評論,如果有一個修正TIA

+0

那麼你建議我做什麼?目標是將文本字段中的文本保存到變量中,以便我可以在另一個類中使用它。基本上我試圖保存用戶輸入到一個變量的用戶名,所以我可以從另一個類的數據庫訪問該用戶名的內容 – user3754524 2014-12-02 06:52:36

+0

感謝您的答案,但這個建議對我無效,因爲我已經在擴展幀 – user3754524 2014-12-02 20:12:38