Re: Java Threads Question
mearvk wrote:
You version was not compliable (Mediator is missing)
nor runnable (no main()). This variant, that compares your
method and my method, is both compilable and runnable.
<sscce>
import javax.swing.*;
import java.awt.*;
import javax.swing.AbstractAction;
import java.awt.event.*;
import java.util.concurrent.locks.ReentrantLock;
class JPasswordDialog extends JDialog
{
Mediator mediator=null;
JPanel mainPanel=null;
JPanel usernamePanel=null;
JPanel passwordPanel=null;
JPanel buttonPanel=null;
JLabel usernameL=null;
JLabel passwordL=null;
JTextField usernameTF=null;
JPasswordField passwordTF=null;
JButton login=null;
JButton cancel=null;
public static void main(String[] args) {
JFrame f = new JFrame("Log In");
f.setDefaultCloseOperation(
JFrame.DISPOSE_ON_CLOSE);
f.setLocationRelativeTo(null);
final JPasswordDialog jpd = new
JPasswordDialog(f,
"Enter Password", new Mediator());
Container c = f.getContentPane();
c.setLayout(new GridLayout(0,1));
final JTextField username = new JTextField();
username.setEditable(false);
final JTextField password = new JTextField();
password.setEditable(false);
JButton b1 = new JButton("Prompt");
b1.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent ae) {
System.out.println("Hi!");
jpd.prompt();
username.setText( jpd.getUsername() );
password.setText( jpd.getPassword() );
System.out.println("Bye!");
}
} );
c.add(b1);
JButton b = new JButton("Log In");
b.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent ae) {
System.out.println("Hi!");
jpd.setVisible(true);
username.setText( jpd.getUsername() );
password.setText( jpd.getPassword() );
System.out.println("Bye!");
}
} );
c.add(b);
c.add(username);
c.add(password);
f.pack();
f.setVisible(true);
}
PasswordDialogOKAction passwordDialogOKAction=null;
public JPasswordDialog(JFrame owner, String title, Mediator m)
{
super(owner, title, true);
this.mediator=m;
instantiateComponents();
initMainPanel();
initUsernamePanel();
initPasswordPanel();
initButtonPanel();
this.add(mainPanel);
setResizable(false);
setBounds(owner.getX()+owner.getWidth()/2-125,
owner.getY()+owner.getHeight()/2-65,250,130);
}
public String[] prompt()
{
setVisible(true);
try
{
synchronized (passwordDialogOKAction.lock)
{
wait();
}
}
catch(Exception e)
{
System.err.println(e);
}
return new String[]{getUsername(),getPassword()};
}
public JTextField getUsernameTextField()
{
return usernameTF;
}
public JTextField getPasswordField()
{
return passwordTF;
}
public synchronized String getUsername()
{
return usernameTF.getText();
}
public synchronized String getPassword()
{
return new String(passwordTF.getPassword());
}
private void instantiateComponents()
{
mainPanel=new JPanel();
usernamePanel=new JPanel();
passwordPanel=new JPanel();
buttonPanel=new JPanel();
usernameL=new JLabel("Username: ");
passwordL=new JLabel("Password: ");
usernameTF=new JTextField();
passwordTF=new JPasswordField();
login=new JButton("Login");
cancel=new JButton("Cancel");
}
private void initMainPanel()
{
mainPanel.setLayout(new GridLayout(3,1,0,0));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
mainPanel.add(usernamePanel);
mainPanel.add(passwordPanel);
mainPanel.add(buttonPanel);
}
private void initUsernamePanel()
{
usernamePanel.setLayout(null);
usernameL.setBounds(0,0,70,20);
usernameTF.setBounds(80,0,145,20);
usernamePanel.add(usernameL);
usernamePanel.add(usernameTF);
}
private void initPasswordPanel()
{
passwordPanel.setLayout(null);
passwordL.setBounds(0,0,70,20);
passwordTF.setBounds(80,0,145,20);
passwordPanel.add(passwordL);
passwordPanel.add(passwordTF);
}
private void initButtonPanel()
{
buttonPanel.setLayout(new GridLayout(1,2,15,15));
buttonPanel.add(login);
buttonPanel.add(cancel);
login.setAction((passwordDialogOKAction=new
PasswordDialogOKAction("Login",this, mediator)));
cancel.setAction(new
PasswordDialogCancelAction("Cancel",this));
}
}
class PasswordDialogOKAction extends AbstractAction
{
Mediator mediator=null;
JPasswordDialog dialog=null;
public ReentrantLock lock=new ReentrantLock();
public PasswordDialogOKAction(String name, JPasswordDialog
dialog,
Mediator m)
{
super(name);
this.dialog=dialog;
this.mediator=m;
lock.lock();
}
public void actionPerformed(ActionEvent ae)
{
if(dialog.getUsername().length()<0 ||
dialog.getUsername().length()>20)
{
JOptionPane.showMessageDialog(dialog, "Invalid
Username.");
lock.unlock();
return;
}
if(dialog.getPassword().length()<0 ||
dialog.getPassword().length()>20)
{
JOptionPane.showMessageDialog(dialog, "Invalid
Password.");
lock.unlock();
return;
}
dialog.dispose();
}
}
class PasswordDialogCancelAction extends AbstractAction
{
JPasswordDialog dialog=null;
public PasswordDialogCancelAction(String name, JPasswordDialog
dialog)
{
super(name);
this.dialog=dialog;
}
public void actionPerformed(ActionEvent ae)
{
dialog.dispose();
}
}
class Mediator {
Mediator() {
}
}
</sscce>
Andrew T.