如何在类的其他方法中使用在构造函数中初始化的对象

机器人

在这里编程新手。我正在使用Swing,JDBC(Oracle)创建一个简单的登录应用程序。它在大多数情况下都按预期工作。该应用程序具有3类-逻辑,UI和DBConnection。

请在此处参考整个代码:完整代码

1. LoginLogic.java

    public class LoginLogic {

    LoginUI lu;

    public LoginLogic() {
        lu = new LoginUI();

    }

    public LoginLogic(ResultSet rs) {
        process(rs);
    }

    private void process(ResultSet rs) {
        try {
            if (rs.next()) {
                lu.loginSuccess();

            } else {
                lu.loginFailed();
            }
        } catch (SQLException e) {
            // TODO: handle exception
        }
    }

    public static void main(String[] args) {

        new LoginLogic();

    }


 }

最初,我直接显示了一个JOptionPane来代替loginSuccess()和loginFailed()方法,它按预期工作。但是我想将所有UI功能都委派给UI类,因此我在UI类中创建了这两个方法

void loginSuccess() {
        JOptionPane.showMessageDialog(null, "Login Successful!");
}

void loginFailed() {
    JOptionPane.showMessageDialog(null, "Login Failed!");
} 

但是不会使用我在构造函数中创建的UI对象调用这些方法。没有错误,但是也没有JOptionPane。

如何在process()方法中使用UI对象引用lu来调用UI类的方法?

Guizmoo03

正如JB Nizet解释的那样,您的代码中需要进行一些更改。尝试以下代码(对我有用)。

public class LoginLogic {

LoginUI lu;

public LoginLogic() {
    lu = new LoginUI();

}

public LoginLogic(ResultSet rs) {
    lu = new LoginUI();
    process(rs);
}

private void process(ResultSet rs) {
    try {
        if (rs.next()) {
            lu.loginSuccess();

        } else {
            lu.loginFailed();
        }
    } catch (SQLException e) {
        // TODO: handle exception
    }
}

public static void main(String[] args) {

    /*/ Here you shld get your result rs first 

            con is your Connection object
            Statement stmt = con.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE,
            ResultSet.CONCUR_UPDATABLE);

            ResultSet rs = stmt.executeQuery("SELECT yourColumn FROM yourTable");
    //*/

    new LoginLogic(rs);
}
}

已编辑

根据我们的评论,问题在于您正在以下位置创建一个新对象:

 private void getConn(String uname, String pwd) {
    ...
        // 4. Process the result set
        new LoginLogic(rs);

    ...

}

这意味着您没有在if()语句中调用正确的对象。您的新对象是使用参数化构造函数构造的,该构造函数不会初始化lu或对其进行更新。

编辑2

我认为您必须对设计进行一些更改。我认为以下内容将为您工作,但您必须处理例外情况。

public class LoginLogic {

LoginUI lu;

public LoginLogic() {
    lu = new LoginUI();

}


public void process() {
    try {
        if (lu.getRs().next()) {
            lu.loginSuccess();

        } else {
            lu.loginFailed();
        }
    } catch (SQLException e) {
        // TODO: handle exception
    }
}

public static void main(String[] args) {

    LoginLogic loginLogic = new LoginLogic();
    loginLogic.process();
 }
 }

loginUI将更改为:

public class LoginUI {

      ...
       ResultSet rs;

       public ResultSet getRs() {
          return rs;
       }
       ...
      btnLogin.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                String uname = tfUname.getText().trim();
                String pwd = tfPwd.getText().trim();

                LoginDbConn loginDbConn = new LoginDbConn(uname, pwd);// startDB after user presses     
                rs = loginDbConn.getConn();

            } catch (Exception ex) {
                // TODO: handle exception
            }

        }
    });

    ....
 }

而LoginDbConn对此:

 public class LoginDbConn {

String uname;
String pwd;
ResultSet rs;
/*
 * public LoginDbConn() { // TODO Auto-generated constructor stub }
 */

public LoginDbConn(String uname, String pwd) {
    this.uname = uname;
    this.pwd = pwd;
}

public ResultSet getConn() {
    try {
        // 0. Register the JDBC drivers
        String driverClass = "oracle.jdbc.driver.OracleDriver";
        Class.forName(driverClass);
        // or DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

        // 1. Get a connection to the Database
        String dbUrl = "jdbc:oracle:thin:@localhost:1521:xe";
        String dbuname = "scott";
        String dbpwd = "tiger";
        Connection conn = DriverManager.getConnection(dbUrl, dbuname, dbpwd);

        // 2. Create a statement
        // String sql = "SELECT * FROM users WHERE name = '"+uname+"' and
        // password = '"+pwd+"'";
        // Statement st = conn.createStatement();
        String sql = "select * from users where name = ? and password = ?";
        PreparedStatement pst = conn.prepareStatement(sql);

        pst.setString(1, uname);
        pst.setString(2, pwd);

        // 3. Execute SQL query
        rs = pst.executeQuery();

        // 5. Close Connection
        // conn.close();

        return rs;
    } catch (SQLException | ClassNotFoundException e) {

            // THIS EXCEPTION MUST ABSOLUTELY BE HANDLED
    }
    return rs;
}

}

希望这会有所帮助(如果是,请投票给答案)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在构造函数的super()方法调用中使用子类变量(this)初始化其他类?

如何模拟使用外部方法调用在构造函数中初始化的对象?

如何在其他类中使用参数化构造函数创建类的对象?

在构造函数的可变参数中使用其他模板类执行模板类的初始化

如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

在Java构造函数中使用变量来初始化仍在构造函数中的其他变量

如何在构造函数中初始化对象数组?

如何在类构造函数中使用参数初始化std :: array的大小?

如何在类的构造函数中初始化对象的2D向量?(C ++)

如何使可以使用Typescript中的对象或常规参数构造函数初始化的类?

如何使用实现父接口的类中的构造函数初始化接口类型的对象?

如何在工厂方法中初始化具有多个参数构造函数的类

我如何在初始化列表中的构造函数之后初始化变量/对象?

如何使用保留在类的构造函数中的Modal Object并从其他方法调用它?

在构造函数中使用“ this”以及Java中的其他方法-何时可以跳过它?

C ++构造函数如何初始化其类的对象?

如何在异步方法中使用其他类中的其他函数

如何在PHP中向其他方法提供构造函数参数?

初始化时如何在类的构造函数调用中容纳InputStream对象的FileInputStream对象?

我可以使用在类构造函数中初始化的ofstream类型的成员变量吗?

如何在派生类构造函数中初始化基类成员变量?

在初始化列表中使用空构造函数初始化父类?

在类构造函数中初始化自定义struct对象的正确方法

是否可以在构造函数中使用this.fieldname初始化基类中的字段?

用其他方法初始化属性

使用构造函数初始化类中的指针

如何在运行时使用构造函数初始化类中私有的数组?

如何访问在构造函数(JAVA)中初始化的对象?

Java:使用在其他方法和类的main方法中创建的数组