【问题标题】:Java - Showing message dialogue halts the TimerTask that's runningJava - 显示消息对话框会停止正在运行的 TimerTask
【发布时间】:2017-05-25 08:59:02
【问题描述】:

我制作了一个简单的应用程序,如果有文件要上传或下载,它会自动向服务器上传/下载文件。我正在使用 Timer Task 定期检查本地是否有文件要上传,或者是否有在线文件​​要下载。

一切正常,我决定每次上传/下载成功时,我都会显示一个消息对话框,向用户显示文件已成功上传/下载。

到目前为止,这就是我所拥有的,我将这个函数称为infoBox。请注意,我在TimerTask 中这样做:

public static void infoBox(String infoMessage, String titleBar){
    Toolkit.getDefaultToolkit().beep();
    JOptionPane.showMessageDialog(null, infoMessage, titleBar,  
                                 JOptionPane.INFORMATION_MESSAGE);
}

然后根据我是否收到文件或发送文件,我这样称呼它:

infoBox("Files Sent!", "Files were sent successfully!");

或者

infoBox("Files Received!", "Files were downloaded successfully!");

而且效果很好。如果我从服务器获取文件,或将文件上传到它,则消息弹出正常。

但是,TimerTask 似乎在显示消息对话时停止。我必须单击“确定”才能关闭对话并让 TimerTask 再次执行它的操作。

我想要发生的是让 TimerTask 一遍又一遍地执行,不管它显示了多少消息对话。

我感觉我在声明和调用infoBox 函数的地方放错了位置。有没有办法让程序例行任务在我显示消息对话时持续执行?

【问题讨论】:

  • JOptionPane.showMessageDialog() 用于获取用户响应,因此您的线程已暂停。考虑写入日志或文本区域,以便用户滚动浏览。
  • @MinhKieu 我需要直观地向用户展示。如果文件正在下载/上传,我已经在写入控制台窗口,这就像一个日志。
  • 然后使用 JLabel 或其他不需要用户确认的对话框。
  • @MinhKieu 是的,这就是这个问题的全部意义所在,找到一种方法可以让 JLabel 不会阻塞我的主线程,或者找到一个替代库来显示不会阻塞我的主线程的对话。跨度>

标签: java


【解决方案1】:

找到answer here

只需在一个线程中运行代码,它就不会再停止主线程了。

public static void infoBox(String infoMessage, String titleBar){
  Thread t = new Thread(new Runnable(){
        public void run(){                  
            Toolkit.getDefaultToolkit().beep();
            JOptionPane.showMessageDialog(null, infoMessage, titleBar, JOptionPane.INFORMATION_MESSAGE);
        }
    });
  t.start();

}

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多