这是一个启动新窗口(子表单)的应用程序。提交此子表单时,应该处理返回的数据并更新父表单。但是,启动子表单时程序没有响应。有人可以解释为什么会发生这种情况以及我应该如何解决它吗?
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();
}
}
最佳答案
您不应该在 UI 线程(在事件调度线程上)上调用诸如 cond.await();
之类的内容。这就是您的 UI 挂起的原因。另外,即使这不相关,也不要像捕获 InterruptedException
时那样使用空的 catch block 。
关于java - 程序在启动子表单时无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504736/