当装载大数据时, 弹出 一个loading的提示框, 当装载完毕隐藏。
由于modle 为true的JDialog显示时阻断其他进程,所以不能检测装载的进程而自动隐藏。所以必须使用modle为false的,即super(owner, "loading...", false);,但当我调用其setVisible(true)时,可以弹出框,也可以在装载后自动隐藏,但始终没有显示上面的label。为什么不能显示呢?public class ICPLoadingDialog extends JDialog {public ICPLoadingDialog(JFrame owner, String loadingTip ){
super(owner, "loading...", false);
this.setPreferredSize(new Dimension(200, 200));setLocation(
(Toolkit.getDefaultToolkit().getScreenSize().width - getSize().width - 200) / 2,
(Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height - 200) / 2);Image loadingImage = Toolkit.getDefaultToolkit().getImage(
Constant.LOADING_PICTURE);
Icon loadingIcon = new ImageIcon(loadingImage);JLabel parentLabel = new JLabel(loadingIcon);
parentLabel.setOpaque(true);
this.getContentPane().add(parentLabel, BorderLayout.CENTER);this.pack();
this.setVisible(true);
}
}

解决方案 »

  1.   

    你可以把Dialog设置成Model的, 但setVisible和dispose的方法单独放在一个线程里来调用.
                        SwingUtilities.invokeLater(new Runnable(){
                            public void run()
                            {
                                waitDialog.setVisible(true);
                            }
                        });
    //...花时间的行为...
                        SwingUtilities.invokeLater(new Runnable(){
                            public void run()
                            {
                                waitDialog.close();
                                waitDialog.dispose();
                            }
                        });
      

  2.   

    谢谢回复,这是个好办法。我试过了,虽然这样保证他们在一个线程里了。但执行情况却是,在耗时行为做完后,dialog才开始显示,并且显示一下就隐藏了,即setvisible(true)和close()动作似乎连到一块了。这是不是因为invokelater是在后台事件排队造成的?
    期待回复
      

  3.   

    为什么我试是可以的呢?
    public static void main(String args[]) throws InterruptedException {
    final JDialog dialog = new ICPLoadingDialog(null, "123");
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    dialog.setVisible(true);
    }
    });
    // ...花时间的行为...
    Thread.sleep(10000);
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    dialog.dispose();
    }
    }); }
      

  4.   

    或许是因为sleep的缘故。因为sleep是阻塞当前进程。
    我的是这样,先发送一个耗时请求,后台完成后给我一个回调,在这个过程中,显示dialog
    void refresh(){
    ...
    // load完成标志
    loaded = false;

    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    loadingDialog.setVisible(true);
    }
    });

    // ...花时间的行为...
    ICPMdiFrame.getCriterionInterface().updateView(newView);



    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    //等待load完成
    while(loaded == false){}

    loadingDialog.setVisible(false);
    loadingDialog.dispose();
    }

    });
    ...

    }


    void onUpdate(){
    // updateView()完成后调用
    loaded = true;
    }
      

  5.   

    我刚才说的结果有误,因为拿sleep可能有问题,我后来换作for(int i=0; i<10000; i++);
    结果和最初一样,即使modle为true,仍没有画出图来,但确实可以到点消失,或许就差一点了
      

  6.   

    我后来把后一个invokeLater放进onupdate后,就可以了,这个方法可行!分数奉上,多谢!!