Java:如何从另一个线程启动 UI 对话框,例如对于身份 validator

标签 java multithreading swing dialog authenticator

我的问题简而言之:我的 GUI 应用程序需要执行冗长的网络下载。下载是在单独的线程中处理的。远程站点可能需要身份验证,因此我想定义一个身份 validator 来弹出“输入您的用户名和密码”对话框。我意识到这个对话框需要从 UI 线程运行。

我确信我不是第一个这样做的人。让后台线程在 UI 线程中启动对话框并阻塞直到该对话框被关闭的最佳实践是什么?

附:后台线程非常大,并且不仅仅从网络下载文件。换句话说,目前将其转换为 SwingWorker 可能不切实际,而且无论如何,我也不确定如何从 SwingWorker 解决这个问题。

最佳答案

您需要SwingUtlities.invokeLater显示对话框,并同步/通知对象“暂停”并等待用户响应。

基本上在你的工作线程(非gui)中:

final Object obj = new Object() ; // or something to receive your dialog's answer(s)
Runnable r = new Runnable() {

   void run() {
     Dialog d = new Dialog() ;

     Button b = new JButton("ok") ;
     b.addActionListener(new ActionListener() {
         void actionPerformed(ActionEvent e) {
             synchronize(obj) { // can lock when worker thread releases with wait
                obj.notify() ; // signals wait
             }
         }
     }) ;

   }
} ;

synchronize( obj ) {
   SwingUtilites.invokeLater(r) ; // executs r's run method on the swing thread
   obj.wait() ; // releases obj until worker thread notifies
}

关于Java:如何从另一个线程启动 UI 对话框,例如对于身份 validator ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6100989/

相关文章:

java - TransactionSynchronizationManager 内的单元测试代码

java - 带有 Spring : WARNING: javax. ws.rs.NotFoundException 的最新 CXF

java - PHP 在 Ubuntu 上运行 jar 文件

Java ConcurrentHashMap 操作原子性

java - JScrollPane 和大小问题

java - 递归到迭代(java)

c# - 如何查询正在运行的线程

perl - 如何在 Perl 中的线程之间共享对象?

java - JTextField 无法正常工作

java - 在 JTextPane 中查找删除的文本