java - 当创建 JDialog 并将模式设置为 true 时,我的线程似乎永远锁定?

标签 java swing awt jtextfield wait

抱歉。想出一个合适的标题有点困难,但希望代码足够清晰。 这是我的方法:

    public static String createString(JFrame owner) {
    final JDialog jd = new JDialog(owner, true);
    final JTextField text = new JTextField();

    text.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            synchronized (text) {
                text.notify();
            }

            jd.dispose();
        }
    });

    jd.setSize(300, 100);
    jd.add(text);
    jd.setLocationRelativeTo(null);
    jd.setVisible(true);

    synchronized (text) {
        try {
            text.wait();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }

    return text.getText();
}

基本上,我正在尝试创建类似于 JOptionPane.showInputDialog() 的东西。 当我的 JDialog 使用 modal = false 创建时,它工作正常。像这样:

final JDialog jd = new JDialog(owner, false);

但是当我将其设置为 true 时,线程永远不会在文本的操作监听器上收到通知。 就像这样:

    public static void main(String[] args) {
    //...
    System.out.println(createString(someFrame));
    System.out.println("I'm never reached");
}

总而言之,当创建对话框时模态设置为 false 时,它​​工作得很好,就是在文本字段上读取一些内容,并让方法返回它,但是当它设置为 true 时,它​​会得到永远锁定,这种行为有什么原因吗?

主线程应该等待,直到用户在对话框上输入输入,然后操作监听器通知主线程停止等待。但它并没有停止等待

最佳答案

您无法在 EDT 上执行等待/通知,因为所有 UI 操作都是在单个线程上处理的。这就是您的 UI 锁定的原因。这不是获得 Swing 对话框结果的方式。相反,您的按钮操作应该调用某种回调来执行您接下来需要发生的任何事情(而不是“通知”等待线程)。

关于java - 当创建 JDialog 并将模式设置为 true 时,我的线程似乎永远锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151642/

相关文章:

java - 无法在 JTable 的单个单元格中添加两个按钮

java - 将图像插入 JList

java - Graphics2D:如何在不规则形状周围创建一致的填充?

java - 当按下某些其他键时,KeyEvent 不会触发

java - 使用 POST 方法中的 ftl 显示列表

java - JPA @ManyToMany 仅在一侧?

java - Java中的Set、Get方法

java - 将 javascript 变量分配给速度模板变量

java - JFrame 不会出现。主要方法不起作用

java - 使用 MouseListener 开始或结束无限循环