变量的值不会更改为actionListener中指定的新值

时间:2014-12-02 06:21:47

标签: java variables

所以我创建了一个名为savedName的变量,然后在动作侦听器方法中将其值设置为新值。它在动作侦听器中打印更改的值,但仅在动作侦听器中打印。似乎一旦动作监听器发生,变量的值就会变回" null" (默认值)。 username_txt是用户输入信息的文本字段。但正如我所说,该值仅在动作侦听器方法中暂时更改,并且一旦动作侦听器发生,它就会更改回默认值。我已经为savedName加上了语句。

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){

        }
     }
}                

2 个答案:

答案 0 :(得分:0)

注意:我无法评论我的想法,所以我只是将其作为答案发布:)以下评论让我更新我的答案。

jButton2ActionPerformed之后会发生什么?它将留在LoginWindow课程中,是否会去另一个班级?如果是,则String savedName的值将返回null。

  

实例变量在类中声明,但在方法之外。他们   也称为成员或字段变量。分配对象时   在堆中,每个实例变量值都有一个插槽。   因此,在创建对象时会创建实例变量   当物体被摧毁时被摧毁。可见所有方法和   通常应该声明定义类的构造函数   私人,但可能会给予更大的知名度。 click here.

这是我的建议。

首先:

创建一个实例变量为public static String savedName = "";

的类

E.g。

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

答案 1 :(得分:0)

您从另一个类获取null是因为您正在创建一个新对象,而不是将该值传递给另一个类。这可以通过在UserMainWindow类中放置一个构造函数并接受名称的String来完成。 如果你已经有一个构造函数,只需接受String作为参数,并为字符串创建一个变量并设置它..

示例代码:(注意这是UserMainWindow类)

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

现在你正在创建这个对象的类,传递给它的字符串如下:(这是你创建userMainWindow类的类)

UserMainWindow wind = new UserMainWindow(savedName);

现在你应该将savedName保存在你的另一帧(用户主窗口)中,而另一帧则被丢弃。