首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

【Swing实现弹出GIF图像 揭示用户等待】

2013-10-27 
【Swing实现弹出GIF图像 提示用户等待】本帖最后由 xiangmingddd 于 2013-10-24 22:41:52 编辑因为系统需要

【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);


                                                executor.execute(loading);
                                                executor.shutdown();


[解决办法]


[解决办法]
1 - 查询数据库的方法在后台线程调用

2 - 启动一个 javax.swing.Timer,用于更新等待的动画

3 - 此 timer 的 ActionListener 每次更新动画前检查某【线程安全】的flag,可以用 AtomicBoolean

4 - 查询数据库结束后更改 3 中的 flag,ActionListener 结束动画更新,dispose popup,终止timer。
[解决办法]
为什么子窗口不能显示在父窗口上方?
在新建一个子窗口的时候就在构造方法里面把父窗口传进去
public ChildFrame(JFrame parantFrame){
   this.parantFrame = parantFrame;
}

public void initComponent() {
   Point p = parantFrame.getLocation();
   this.setLocation(p.getX(),p.getY()-100);
   ...

}
大概这么写

热点排行