1

我正在使用 Java Swing 开发我的第一个 GUI 程序。我有一个登录表单类,它读取用户名和密码,然后检查本地数据库中是否存在匹配的用户名/密码组合。如果有,我希望能够将用户名从 JFrame 对象返回到我的主类。这只会在我点击我的登录按钮的动作触发后发生。

我不知道如何让这个类在特定时间之后返回:

public class Login extends JFrame {

//declaration of components
private JTextField userText = new JTextField(12);
private JPasswordField passText = new JPasswordField(12);

//declaration of variables
String username;
String password;
//...
class loginAction extends AbstractAction{
    loginAction(){
        super("Login");
        putValue(SHORT_DESCRIPTION, "Click to login");
    }
    public void actionPerformed(ActionEvent e){
        userLogin();
    }
}

public String userLogin(){
    String sql = "SELECT * from Employees " +
                 "WHERE Username = ? AND Password = ?";

    try(PreparedStatement ps = con.prepareStatement(sql)){
        ps.setString(1, userText.getText());
        ps.setString(2, new String(passText.getPassword()));
        ResultSet rs = ps.executeQuery();

        if(rs.next())
            //RETURN USERNAME BACK TO MAIN CLASS...How?
        else
            JOptionPane.showMessageDialog(this, "Incorrect username or password.", "", JOptionPane.ERROR_MESSAGE);
    }
    catch (SQLException e) {
        utils.Print.print(e.getMessage());
        printSuppressed(e);
    }
    finally{
    }
}
//...
Login(Connection connect){
///...
    JButton login = new JButton(new loginAction())
//...
}
4

3 回答 3

4

不要为此使用 JFrame,因为这是创建 JDialogs 和 JOptionPanes 等模态对话框的目的。这就是他们存在的理由,如果你不利用他们,他们会很伤心。说真的,您知道调用 JOptionPane 时会发生什么,来自调用程序的代码流如何停止并等待 JOptionPane 在继续之前返回,这就是模态 JDialogs 所做的(实际上 JOptionPane 只是 JDialog 的一个变体),这正是您想要的行为。

请注意,无论您是否使用一个类,您几乎都不应该让一个类扩展 JFrame。相反,将您的代码用于创建 JPanel,然后在您想要显示它们时将它们填充到 JDialogs、JFrames 或任何必要的容器中。

于 2012-12-05T04:16:45.207 回答
2
  1. 尽可能避免从顶级容器(如框架和对话框)扩展,最好将 UI 组件放置到JPanel. 从长远来看,它为您提供了更大的灵活性和重用选项。
  2. 使用 aJDialog而不是 a JFrame,或者更好的是,使用 aJOptionPane它将为您处理按钮(尽管在您执行验证检查之前它需要关闭对话框)。
  3. 不要在 Event Dispatching Thread 中执行长时间运行或阻塞的代码(例如访问数据库)
  4. 在内部维护用户信息并允许调用对象通过 getter 访问信息
于 2012-12-05T04:24:38.067 回答
1

一种方法是将注释行替换为在操作内设置变量的行。然后,您需要保留对该操作的引用。

例如,

loginAction la = new loginAction()
JButton login = new JButton(la)

....

// some other code block with reference to la
if(la.isUsernameValid())  
     la.getUsername()

不过,正如@Hovercraft 所提到的,有更好的方法可以做到这一点

于 2012-12-05T04:21:28.030 回答