在 JDialog 上摆动 wait() 和 notify(),对话框不显示其组件

Posted

技术标签:

【中文标题】在 JDialog 上摆动 wait() 和 notify(),对话框不显示其组件【英文标题】:Swing wait() and notify() on JDialog, the dialog does not show its components 【发布时间】:2020-12-04 13:31:05 【问题描述】:

我有一个鼠标侦听器,当我在应用程序窗口中移动鼠标时会调用它。 在 MouseEntered 方法中,我这样调用 ThreadB:

@Override
   public synchronized void mouseEntered(MouseEvent e) 

     ..

     ThreadB b = new ThreadB();
     b.start();
     System.out.println("Before Sync!!!!!!!");
     synchronized(b) 
         try
         System.out.println("Waiting for b to complete...");
         b.wait();
     catch(InterruptedException ex)
         ex.printStackTrace();
            
    
    System.out.println("After Sync!!!!!!!");


class ThreadB extends Thread 
        
        @Override
        public void run()
            synchronized(this)

                int dialogResult = JOptionPane.showConfirmDialog(null, "Loading process is in progress. Do you want to stop the process?", "Loading Accounts", JOptionPane.YES_NO_OPTION);
                
              
            if (dialogResult == 0) 
                System.out.println("Yes is chosen!!!!");
            else 
                System.out.println("No is chosen!!!!");
            

                System.out.println("before NOTIFY!!!!!!!");
            
                notify();
         
      
   

加载过程按预期停止,但对话框没有被绘制,这意味着它不显示其组件。

非常感谢您的帮助。

非常感谢

问候

【问题讨论】:

【参考方案1】:

您不能在代码中的任何位置执行 GUI 操作,除非该代码在事件调度线程 (EDT) 中运行。您在自己创建的线程上运行它;不允许。使用例如SwingUtilities.invokeLater,或 SwingWorker 系统。

【讨论】:

非常感谢您的及时回复。当我使用 invokeLater 时,该过程不会停止,但对话框显示正常。我需要先捕获用户的输入,然后对其进行解析,然后根据用户的输入继续该过程。

以上是关于在 JDialog 上摆动 wait() 和 notify(),对话框不显示其组件的主要内容,如果未能解决你的问题,请参考以下文章

JDialog 不可见

拖动未修饰的 jDialog

在 JTabbedPane 上的 JPanel 上将 JDialog 居中

JAVA SWING 用了JDialog的模态窗口后,为啥监听器没反应了?

Mac OS X Big Sur 上 webstart 的 JDialog 全屏问题

为啥调用带有 IRF_NO_WAIT 标志的 InternetReadFileEx 函数仍然等待?