Java 在触发操作后从JFrame返回
我正在使用JavaSwing开发我的第一个GUI程序。我有一个登录表单类,它读取用户名和密码,然后检查本地数据库中是否有匹配的用户名/密码组合。如果有,我希望能够将用户名从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
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所提到的,有更好的方法可以做到这一点
JPanel
上。从长远来看,它为您提供了更大的灵活性和重用选项JDialog
而不是JFrame
,或者更好地使用JOptionPane
,因为它会为您处理按钮(尽管在您执行验证检查之前需要关闭对话框)JPanel
上。从长远来看,它为您提供了更大的灵活性和重用选项JDialog
而不是JFrame
,或者更好地使用JOptionPane
,因为它会为您处理按钮(尽管在您执行验证检查之前需要关闭对话框)loginAction la = new loginAction()
JButton login = new JButton(la)
....
// some other code block with reference to la
if(la.isUsernameValid())
la.getUsername()