I have an application that needs to log the user in. Data is stored in a Derby DB. The form below queries it based on the username and password fields, and also sets up a user session, which should populate the user data.
However, the session is returning null even though the db is authenticating the user. How could I put a system.out.println in the main method of this class that would return the session data based on the db query, rather than immediately executing the code and returning null?
Note: The db is working correctly. I can get results based on username and password fields in an sql statement.
public class LoginForm{
private static JTextField userName;
private static JTextField password;
private static JButton submit;
private static int attempts;
private static JFrame main;
private Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
final int MAX_ATTEMPTS = 5;
private UserSession session;
public LoginForm(){
Handler handle = new Handler(); //inner class
LoginFormFocusListener fl = new LoginFormFocusListener(); //inner class
main = new JFrame();
main.setUndecorated(true);
main.setBounds((dim.width/2) - (500/2),(dim.height/2) - (150/2),500, 75);
main.setVisible(true);
main.setAlwaysOnTop(true);
main.setResizable(false);
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
userName = new JTextField(10);
password = new JTextField(10);
main.setLayout(new GridLayout(0,1));
JPanel panel = new JPanel();
main.add(panel);
panel.add(new JLabel("Username: "));
panel.add(userName);
panel.add(new JLabel("Password: "));
panel.add(password);
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createBevelBorder(4), "Please Login"));
submit = new JButton("Submit");
panel.add(submit);
if(attempts > 0){
panel.add(new JLabel("" + (MAX_ATTEMPTS - attempts) + " attempts remaining..."));
}
main.addWindowFocusListener(fl);
submit.addActionListener(handle);
}
public UserSession getSession(){
return this.session;
}
/**
* creates the session that's returned to main/POSsystem via getSession
* @author Matt
*
*/
private class Handler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
String user = userName.getText();
String pass = password.getText();
session = new UserSession();
if(session.authenticate(user, pass)){
System.out.println("User has been authenticated");
JOptionPane.showMessageDialog(null,"Login Successful! ","",JOptionPane.PLAIN_MESSAGE);
}else{
System.out.println("Login Failed!");
JOptionPane.showMessageDialog(null,"Login Failed!","", JOptionPane.WARNING_MESSAGE);
attempts++;
if(attempts < MAX_ATTEMPTS){
new LoginForm();
}else{
JOptionPane.showMessageDialog(null, "Max attempts reached. " +
"Please Contact the administrator of this system. ",
"User Locked",
JOptionPane.ERROR_MESSAGE);
}
}
}
}
/**
* Inner Class
* custom focus events for the login form
* the user may click away from this pop-up to close it.
* @author Matt
*
*/
public class LoginFormFocusListener implements WindowFocusListener{
@Override
public void windowGainedFocus(WindowEvent wEvt) {}
@Override
public void windowLostFocus(WindowEvent wEvt) {
((JFrame) wEvt.getSource()).dispose();
}
}
//test
public static void main(String args[]){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
LoginForm lf = new LoginForm();
System.out.println("Session: " + lf.getSession()); <---NULL!!!
}
});
}
}
If what you really want is to get the output to console then instead of putting the System.out.println code in the main method you should place it as the last line of the actionPerformed method.
If you really, really, really want to have that code in the main method then you should create a class implementing the Runnable interface that allows fetching the created LoginForm
like this:
then change the main method to this:
and finally at the end of the actionPerformed method at this block: