Java 在触发操作后从JFrame返回

Java 在触发操作后从JFrame返回,java,swing,jframe,return,joptionpane,Java,Swing,Jframe,Return,Joptionpane,我正在使用JavaSwing开发我的第一个GUI程序。我有一个登录表单类,它读取用户名和密码,然后检查本地数据库中是否有匹配的用户名/密码组合。如果有,我希望能够将用户名从JFrame对象返回到我的主类。这只能在单击“我的登录”按钮触发操作后发生 我不知道如何让这个类在特定时间后返回: public class Login extends JFrame { //declaration of components private JTextField userText = new JTextFi

我正在使用JavaSwing开发我的第一个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())
//...
}

不要为此使用JFrame,因为这是创建JDialogs和JOptionPanes等模态对话框的目的。这就是它们存在的原因,如果你不使用它们,它们会非常悲伤。不过,说真的,您知道调用JOptionPane时会发生什么,调用程序的代码流如何停止并等待JOptionPane返回,然后再继续,这就是模态JDialogs所做的(实际上JOptionPane只是JDialog的一个变体),这正是您所希望的行为


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

不要使用JFrame,因为这是创建JDialogs和JOptionPanes等模式对话框的目的。这就是它们存在的原因,如果你不使用它们,它们会非常悲伤。不过,说真的,您知道调用JOptionPane时会发生什么,调用程序的代码流如何停止并等待JOptionPane返回,然后再继续,这就是模态JDialogs所做的(实际上JOptionPane只是JDialog的一个变体),这正是您所希望的行为


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

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

e、 g


正如@Hovercraft所提到的,有更好的方法可以做到这一点,一种方法是用一行在动作中设置变量的行替换注释行。然后需要保留对操作的引用

e、 g

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

  • 尽可能避免从顶层容器(如框架和对话框)进行扩展,最好将UI组件放在
    JPanel
    上。从长远来看,它为您提供了更大的灵活性和重用选项
  • 使用
    JDialog
    而不是
    JFrame
    ,或者更好地使用
    JOptionPane
    ,因为它会为您处理按钮(尽管在您执行验证检查之前需要关闭对话框)
  • 不要在事件调度线程中执行长时间运行或阻塞代码(例如访问数据库)
  • 在内部维护用户信息,并允许调用对象通过getter访问信息
  • 尽可能避免从顶层容器(如框架和对话框)进行扩展,最好将UI组件放在
    JPanel
    上。从长远来看,它为您提供了更大的灵活性和重用选项
  • 使用
    JDialog
    而不是
    JFrame
    ,或者更好地使用
    JOptionPane
    ,因为它会为您处理按钮(尽管在您执行验证检查之前需要关闭对话框)
  • 不要在事件调度线程中执行长时间运行或阻塞代码(例如访问数据库)
  • 在内部维护用户信息,并允许调用对象通过getter访问信息
  • loginAction la = new loginAction()
    JButton login = new JButton(la)
    
    ....
    
    // some other code block with reference to la
    if(la.isUsernameValid())  
         la.getUsername()