当装载大数据时, 弹出 一个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);
}
}
由于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);
}
}
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
waitDialog.setVisible(true);
}
});
//...花时间的行为...
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
waitDialog.close();
waitDialog.dispose();
}
});
期待回复
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();
}
}); }
我的是这样,先发送一个耗时请求,后台完成后给我一个回调,在这个过程中,显示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;
}
结果和最初一样,即使modle为true,仍没有画出图来,但确实可以到点消失,或许就差一点了