java - 程序在启动子表单时无响应

标签 java swing concurrency

这是一个启动新窗口(子表单)的应用程序。提交此子表单时,应该处理返回的数据并更新父表单。但是,启动子表单时程序没有响应。有人可以解释为什么会发生这种情况以及我应该如何解决它吗?

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/

相关文章:

java - 在线程中运行时,While 循环不起作用

java - 如何创建具有 1 GB 堆的可执行 jar 文件

java - 如何自动选择JTable中最后插入的行?

java - 用于制作代码编辑器的 JSyntaxPane 的 JavaFX 等价物是什么?

java - 在构造函数中使用 lambda 时的“this”引用转义

java - FileWriter 意外停止

java - 如何将 Opendaylight 连接到 Mininet?

java - 防止在调整 JButton 的容器大小时调整其大小

java - 同步方法有自己的锁吗?

mysql - 从 MySQL 检索唯一标识符