Here is an application which launches a new window (a sub-form). On submitting this sub-form, what should happen is that the returned data gets processed and the parent form is updated. However, the program does not respond when the sub-form is launched. Could someone explain why this occurs and how should I solve it?
public class FormCondition
{
private JLabel nameLabel;
private JTextField name;
private JButton create;
private Lock lock;
private Condition cond;
private String str;
public FormCondition()
{
lock = new ReentrantLock();
cond = lock.newCondition();
create = new JButton("Create");
nameLabel = new JLabel("Name");
name = new JTextField();
name.setEditable(false);
create.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == create)
{
try
{
lock.lock();
try
{
Runnable r = new Runnable()
{
@Override
public void run()
{
System.out.println("Starting a new Thread");
new newForm();
}
};
new Thread(r).start();
System.out.println("about to wait");
cond.await();
name.setText(str);
}
finally
{
lock.unlock();
}
}
catch (InterruptedException e1)
{
// empty
}
}
}
});
JFrame frame = new JFrame("Main form");
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 2));
panel.add(nameLabel);
panel.add(name);
panel.add(create);
frame.add(panel);
frame.setLocationRelativeTo(null);
frame.setSize(200, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void setName(String name)
{
str = name;
System.out.println("Name received is: " + str);
}
class newForm implements ActionListener
{
private JLabel nameLabel;
private JTextField name;
private JButton go;
public newForm()
{
nameLabel = new JLabel("Name");
name = new JTextField();
go = new JButton("Go");
JFrame frame=new JFrame("Second form");
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(0,2));
panel.add(nameLabel);
panel.add(name);
panel.add(go);
frame.add(panel);
frame.setLocationRelativeTo(null);
frame.setSize(200,200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == go)
{
lock.lock();
try
{
String string = name.getText();
System.out.println("Name entered is: " + str);
setName(str);
cond.signal();
System.out.println("Signalled");
}
finally
{
lock.unlock();
}
}
}
}
public static void main(String[] str)
{
new FormCondition();
}
}