我正在使用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())
//...
}
答案 0 :(得分:4)
不要为此使用JFrame,因为这是为其创建的模态对话框,如JDialogs和JOptionPanes。这是他们存在的理由,如果你不使用它们,他们会非常难过。但是说真的,你知道当你调用JOptionPane时会发生什么,来自调用程序的代码流如何停止并等待JOptionPane在继续之前返回,这就是模态JDialog所做的事情(事实上,JOptionPane只是JDialog的一个变种) ),这就是你想要的行为。
请注意,无论您是否使用某个类,都应该几乎不会有类扩展JFrame。相反,将代码设置为创建JPanels,然后将它们填入JDialogs,JFrames或任何需要显示它们的容器时。
答案 1 :(得分:2)
JPanel
上。从长远来看,它为您提供了更大的灵活性和重复使用选择。JDialog
代替JFrame
,或者更好的是,使用JOptionPane
它是否会为您处理按钮(尽管它需要先关闭对话框你可以执行验证检查。)答案 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所提到的,有更好的方法可以做到这一点