2014-12-02 22 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