当前位置: 首页 > 知识库问答 >
问题:

当创建JDialog并将modal设置为true时,我的线程似乎会永远锁定?

冉永宁
2023-03-14

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

    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()。当使用modal=false创建JDialog时,它可以正常工作。这样地:

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时,它会永远锁定,这种行为有什么原因吗?

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

共有1个答案

穆锋
2023-03-14

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

 类似资料:
  • 我的程序应该使用多线程运行很长时间。我需要为线程设置超时的能力,一旦线程终止,我想重新启动它。这是我的代码:

  • 如果我有这个: 如果传入2位数的年份,我的应用程序应该抛出异常吗?这似乎没有任何问题。

  • 问题内容: 我正在尝试在JPA中使用悲观锁定,而不是针对Postgres数据库使用Hibernate 3。我无法超时锁定-它似乎永远挂着。 这是一个例子: 据我了解,em2应该尝试长达五秒钟(5000毫秒)来获取锁,然后应该抛出异常。而是代码陷入僵局。 如果我在两个不同的线程中运行它,那么我会看到线程2(带有em2)在线程1(em1)释放它后立即获得了锁。因此锁定正在发生,只是永不超时。 我用PE

  • 7.1 创建远线程 两种注入虽然在基础原理上不同,但是实现的方法差不多:创建远线程。这由 CreateRemoteThread()完成,同样由由 kernel32.dll 导出。原型如下: HANDLE WINAPI CreateRemoteThread( HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes,

  • 问题内容: 我试图比较两个相同类型的对象(在dosHave方法中),但是我从未返回过“ true”。这是我的代码: “ Osoba”类如下所示: 来自主代码: 无论我要使用什么输入,这部分都永远不会发生。“ kartoteka”是我当然进口的包裹。每个类都在单独的程序包中,但是使用它们没有问题。我已经尝试了一段时间,但没有任何帮助,似乎 从来都不是真的,但我不知道为什么。没有Boolean.TRU

  • 问题内容: 我正在使用Asp.net MVC3,并尝试在服务器上做一个简单的Ajax发布,它返回部分视图并在搜索过程中更新我的项目列表。 Ajax成功调用服务器,服务器通过发送部分视图进行响应。但是部分视图始终在新页面中呈现。我发现这是因为它不知道即将到来的ajax调用,因此它呈现了一个新页面。 我的控制器代码非常简单: 但是无论如何,Request.IsAjaxRequest()始终返回fals