日期:2014-05-20  浏览次数:20796 次

【Swing实现弹出GIF图像 提示用户等待】
本帖最后由 xiangmingddd 于 2013-10-24 22:41:52 编辑
因为系统需要在某一步查询较长时间数据库,为了友好提示需要在查询阶段显示让用户等待的旋转图片,使用多线程操作,但因为执行的时候主线程没有阻塞而是继续向下执行导致子线程中还没查寻到数据就返回了 最终导致前台接收的值是空值 而报空指针。后来用线程的wait和notify来手动控制主线程的等待和阻塞。能实现子线程完成后父线程继续执行,也能从任务栏明确看到需要弹出的JLabel是弹出了的 但是就是不能显示在主窗口上方 手动点击也没用 程序里也设置了 frame.setAlwaysOnTop(true);
请教各位帮忙看看

程序入口类的上只定义一排Menu---在组窗口构造时传入Menu。
Menu是作为另一个单独类定义的,并没有在程序入口类中定义。
点击Menu上的一个MentItem执行下面的操作

final JFrame frame = new JFrame();
//MyLabel是重写了paint方法的Label
MyLabel stateLbl = new MyLabel(new ImageIcon(JFrame.class.getResource("/wait.gif")).getImage());
 stateLbl.setVisible(true);
frame.setUndecorated(true);
        frame.add(stateLbl,BorderLayout.CENTER);
        //frame.setSize(200, 20);
        frame.setSize(200, 200);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setAlwaysOnTop(true);
        frame.setVisible(true);
        //Thread.sleep(10000);
         final Thread mainTh = Thread.currentThread();
         new Thread() {
 
  public void run() {
 
   try {
   Thread.sleep(10000);
 
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
   frame.setVisible(false);
   synchronized (mainTh) {
   mainTh.notify();
  }
  }
  }.start();
         synchronized (mainTh) {

          mainTh.wait();
}


swing java 多线程

------解决方案--------------------
下载swingx-core.jar 包,然后这个代码是显示一个loading的label
public static void main(String[] args) {
JXFrame frame = new JXFrame("test", true);
 JXBusyLabel label = new JXBusyLabel();
 frame.add(label);
 frame.setSize(200, 300);
 //...
 label.setBusy(true);
 frame.setVisible(true);
}

你那个多线程去看下CountDownLatch。
下面是我以前项目里和你的需求一样的

BusyDialog bd = new BusyDialog();
                                                ExecutorService executor = Executors
                                                                .newCachedThreadPool();

                                                CountDownLatch latch = new CountDownLatch(1);
                                                CopyWorker w1 = new CopyWorker(latch, "CopyWorker",
                                                                file, des);
                                                LodingWorker loading = new LodingWorker(latch, bd);

                                                executor.execute(w1);