【问题标题】:Return from JFrame after an Action is fired触发动作后从 JFrame 返回
【发布时间】:2012-12-05 03:57:44
【问题描述】:

我正在使用 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())
//...
}

【问题讨论】:

标签: java swing jframe return joptionpane


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    1. 尽可能避免从顶级容器扩展,例如框架和对话框,最好将 UI 组件放置在 JPanel 上。从长远来看,它为您提供了更大的灵活性和重复使用选项。
    2. 使用JDialog 而不是JFrame,或者更好的是,使用JOptionPane 它将为您处理按钮(尽管在您执行验证检查之前它需要关闭对话框)。
    3. 不要在事件调度线程中执行长时间运行或阻塞的代码(例如访问数据库)
    4. 在内部维护用户信息并允许调用对象通过 getter 访问信息

    【讨论】:

      【解决方案3】:

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

      例如,

      loginAction la = new loginAction()
      JButton login = new JButton(la)
      
      ....
      
      // some other code block with reference to la
      if(la.isUsernameValid())  
           la.getUsername()
      

      正如@Hovercraft 所提到的,有更好的方法来做到这一点

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        • 2012-03-18
        • 2016-03-18
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        相关资源
        最近更新 更多