我使用在从事件调度线程调用,并要求我返回一个完全初始化UI组件Java库的API。它看起来像这样:

public JDialog createDialog();

但是我只能从一个数据库,该数据库可需要10秒有时装载之后填充该对话框。通常我会做,在后台线程,但由于这种方法是从EDT既然叫我要回到对话,这是行不通的。这是一个第三方库,所以我不能改变的方法,但有什么我可以做,以避免阻塞EDT?

有帮助吗?

解决方案

“初始化”并不一定是一样的东西“填充的”。 “初始化”通常意味着该对象已被完全构造,但可能没有任何数据。当然手段“已填充”该数据存在,并且任何数据撷取任务完成。因此,有可能给你的第三方库完全初始化的JDialog没有在所有的任何数据。

我总是像来解决这个问题的方法是创建一个自定义的JDialog其显示忙消息或进度条或类似物,然后请求在另一个线程的数据。当返回数据,我更换了与数据的忙消息(在美国东部时间!)。至于你应该如何执行在后台线程你的要求,我建议使用SwingWorkers。我喜欢用我的自定义的JDialog它处理的SwingWorker方法的要求,并且把手在doInBackground()方法显示相关的任务中的私有done()。这样做,这样可以确保显示相关的任务仅在美国东部时间出现,并与数据库相关的任务只发生断开EDT。如果您想一个相当不错的使用介绍SwingWorkers,请 Sun的工作线程上的教程的。一个简单的例子是:

public class DBDIalog extends JDialog{
     private JLabel busyLabel = new JLabel("Fetching data from DataBase");

     public DBDialog(){
         //do your initialization stuff here
     }

     private class DBFetcher extends SwingWorker<Void,DBInfo>{

        @Override
        protected DBInfo doInBackground() throws Exception{
            return fetchDataFromDB(); //or whatever database call to make
        }

        @Override
        protected void done(){
           try{
               DBInfo info = get();
           //replace your busy label with your DBInfo
           }catch(InterruptedException e){
              //do appropriate thread interrupted stuff
           }catch(ExecutionException e){
              //do appropriate general error handling stuff 
           }

        }
     }
}

有几件事情要记住,虽然:该done()方法不是抽象的,这样你就不会覆盖其需要。你应该,虽然。如果您doInBackground()实现抛出一个异常,该异常将被吞噬,除非done()已被重写。另外,不要从doInBackground()里面更改您的GUI,除非你使用SwingUtilities.invokeLater(Runnable),作为doInBackground()从不同的线程比EDT执行,使GUI从后台线程改变是要求陌生和莫名其妙的错误。

当这应该使用?不像其他的编程任务,某物的时间太长响应点在图形用户界面更短了很多 - 我通常所见写下来的数量约为250毫秒。如果任务需要超过15分钟,它应该是在后台线程。在你的情况下10秒应的绝对的是在后台线程,但是你已经知道了:)

编辑:

看到你的评论,我看到了我的大部分职位是非常实际意义。但是,你仍然可以使用的SwingWorker:

让你的SwingWorker进行数据检索,并在done()方法,把它从数据和手工建造的JDialog该对话框到您的第三方库。

其他提示

构建没有数据的对话框中,然后开始一个任务来填充它。

从用户体验的角度来看,任何需要10秒从开始到完成将是一个问题。这是最好的,如果你要他们的的东西的马上,即使它不是最终形式。如果有必要,你可以弹出一个模式对话框,简单地说:“正在加载。”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top