触发Action后从JFrame返回

时间:2012-12-05 03:57:44

标签: java swing jframe return joptionpane

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

3 个答案:

答案 0 :(得分:4)

不要为此使用JFrame,因为这是为其创建的模态对话框,如JDialogs和JOptionPanes。这是他们存在的理由,如果你不使用它们,他们会非常难过。但是说真的,你知道当你调用JOptionPane时会发生什么,来自调用程序的代码流如何停止并等待JOptionPane在继续之前返回,这就是模态JDialog所做的事情(事实上,JOptionPane只是JDialog的一个变种) ),这就是你想要的行为。

请注意,无论您是否使用某个类,都应该几乎不会有类扩展JFrame。相反,将代码设置为创建JPanels,然后将它们填入JDialogs,JFrames或任何需要显示它们的容器时。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

如,

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

....

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

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