2013-01-16 44 views
0

我是java中面向对象方法的新学习者,我的系统有一些问题。 我目前正在做一个简单的GUI系统。在一个jForm中,据推测我必须在那里写所有的代码作为程序方法。但我想尝试它在一个单独的类(OOP)中编码。而我在主表单中所要做的就是调用我在另一个类上创建的方法。 但我的主要问题是我将如何调用或从窗体调用一个对象到另一个类。我该如何调用/调用其他java类中的对象?

下面是一个例子...

public void checkUser(){ 
    try { 
     sql = "SELECT accessLevel FROM user_accounts WHERE userName = 'admin'"; 
     stmt = conn.createStatement(); 
     rs = stmt.executeQuery(sql); 
     rs.first(); 
     int accessLvl = rs.getInt(1); 
     if (accessLvl != 1){ 
      btnAddUser.setEnabled(false); 
      jPanel3.setEnabled(false); 
     } 
    } 
    catch(Exception e){ 
     JOptionPane.showMessageDialog(null, "Exception on Verifying User"); 
    } 
} 

我想这个方法(checkUser())到另一个类编写把它的主窗口中,而不是。但我的问题是我无法访问在主窗体中启动的对象btnAddUser(按钮名称)和JPanel13(面板名称)。如果我将直接使用如何访问这些对象,以便我可以访问其他类。

回答

0

你可以写这个方法为静态到另一个类,像下面这两个参数之一,如果一个JButton等是JPanel的

public static void checkUser(JButton btnAddUser,JPanel jPanel3){ 
    try { 
     sql = "SELECT accessLevel FROM user_accounts WHERE userName = 'admin'"; 
     stmt = conn.createStatement(); 
     rs = stmt.executeQuery(sql); 
     rs.first(); 
     int accessLvl = rs.getInt(1); 
     if (accessLvl != 1){ 
      btnAddUser.setEnabled(false); 
      jPanel3.setEnabled(false); 
     } 
    } 
    catch(Exception e){ 
    JOptionPane.showMessageDialog(null, "Exception on Verifying User"); 
    } 

}

,你甚至可以从哪里该方法你之前编写的代码像

NewClass.checkUser(btnAddUser,jPanel3); 

NewClass是你写这个checkUser()方法的类。

您还需要将参数传递给像sql string,Statement和ResultSet对象这样的方法,或者将它们声明为静态,以便您可以使用类名轻松访问它们。

+0

感谢这个答案... 中,我有方法 'checkUser(康涅狄格州的连接,用户字符串){...}' 的论点我做了这样的代码来调用该对象... 'myMainClass.btnAddUser.setEnabled(false)' –

+0

,然后在主类上将这些对象实例化为公共和静态... –

0

checkUser方法应该:

  • 接受一个参数是检查(用java.sql.PreparedStatement更换java.sql.Statement当你这样做)的用户名。
  • 返回一个布尔值,表示调用代码(您的表单)用于根据需要启用或禁用组件。
  • 抛出调用代码(您的表单)可以捕获并显示消息对话框的异常。

其中OOP是关于分离的关注点 - 您的表单处理用户界面,类与checkUser方法处理用户身份验证。

另外,像checkUser这样的函数通常会引发异常,认证失败。这是因为对于使用该方法的人来说,检查返回值失败并允许未经身份验证的用户进入系统非常容易。

0

但我的问题是我无法访问在主窗体中启动的对象btnAddUser(按钮名称)和JPanel13(面板名称)。

您需要将此类声明为类变量,指定适当的getter and setter methods,然后实例化此类以检索值。

此外,正如尼克所说,你需要逻辑分离代码,这将使整个设计模块化。在这里,您可以将数据库代码移入单独的DataAccess类中,并公开用于查询的方法。连接对象可以在构造函数中创建。

0

这个tutorial可能会提供一些见解,并把你放在正确的道路上。那里有更多不同的解决方案和教程。