本帖最后由 xiangmingddd 于 2013-10-24 22:41:52 编辑

解决方案 »

  1.   

    下载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();
      

  2.   

    楼主的想实现的效果应该是类似于弹出框的那种形式吧?
    问题就是不能显示在父窗口的上方,这一句我理解有点偏差,可以的话楼主发个图。。我的理解是这种效果么?
    是的 弹出的框不能显示在主界面上方 弹窗是在父线程中完成的 但是弹窗后马上new Thread了一个新线程来执行一些耗时的代码同是父线程阻塞住 等带新开线程中任务执行完后父线程再执行。
    现在的问题就是在不新开线程的情况下能正常弹窗,但是在新开线程后弹窗就人在主窗口下面了 怎么也显示不出来
    可以从图中明显看到弹出框是有的 就是不能显示在上面
      

  3.   


    谢谢 CountDownLatch挺好用的比我手动notify方便多了  但是我的问题是弹窗还是不能显示在主界面上方
      

  4.   


    谢谢 CountDownLatch挺好用的比我手动notify方便多了  但是我的问题是弹窗还是不能显示在主界面上方
    我弹窗是直接定义好了位置的,
    x,y,w,h
    setBounds(300, 300, 400, 400);
    可以的话楼主可以试一试先获取父类的x,y,然后算出弹窗应该所在的x,y,然后设置到弹窗类中
      

  5.   

    还是不行 我发现是frame.setUndecorated(true);的问题 注释掉这句后能弹出在上方 但是弹出框里是空白 没有我加入的自己的JLabel 
      

  6.   

    1 - 查询数据库的方法在后台线程调用2 - 启动一个 javax.swing.Timer,用于更新等待的动画3 - 此 timer 的 ActionListener 每次更新动画前检查某【线程安全】的flag,可以用 AtomicBoolean4 - 查询数据库结束后更改 3 中的 flag,ActionListener 结束动画更新,dispose popup,终止timer。
      

  7.   

    为什么子窗口不能显示在父窗口上方?
    在新建一个子窗口的时候就在构造方法里面把父窗口传进去
    public ChildFrame(JFrame parantFrame){
       this.parantFrame = parantFrame;
    }public void initComponent() {
       Point p = parantFrame.getLocation();
       this.setLocation(p.getX(),p.getY()-100);
       ...}
    大概这么写
      

  8.   

    恩Timer也能实现效果 我现在的问题不是不显示动画的问题 问题是我在另一个类(和主Jframe不在同一个类)中新new的一个JFarme中add自己重写了panit方法的Jlabel 然后弹出新new这个JFarme显示效果。但是现在能弹出框只是不能显示在主窗口上面 被主窗口挡住了。
    新的Jframe我也设置了setAlwaysOnTop 就是不能显示在主界面上方
      

  9.   

    恩Timer也能实现效果 我现在的问题不是不显示动画的问题 问题是我在另一个类(和主Jframe不在同一个类)中新new的一个JFarme中add自己重写了panit方法的Jlabel 然后弹出新new这个JFarme显示效果。但是现在能弹出框只是不能显示在主窗口上面 被主窗口挡住了。
    新的Jframe我也设置了setAlwaysOnTop 就是不能显示在主界面上方javax.swing.Timer 是推荐的方式,自己用其他线程维护动画,几乎可以肯定有线程安全问题或者违反EDT法则的地方。如果是为了显示动画,我会选择用 glass pane。具体到你的问题,最好不要在一个程序里出现多于一个 JFrame,用 modal 的 JDialog。
      

  10.   

    恩Timer也能实现效果 我现在的问题不是不显示动画的问题 问题是我在另一个类(和主Jframe不在同一个类)中新new的一个JFarme中add自己重写了panit方法的Jlabel 然后弹出新new这个JFarme显示效果。但是现在能弹出框只是不能显示在主窗口上面 被主窗口挡住了。
    新的Jframe我也设置了setAlwaysOnTop 就是不能显示在主界面上方javax.swing.Timer 是推荐的方式,自己用其他线程维护动画,几乎可以肯定有线程安全问题或者违反EDT法则的地方。如果是为了显示动画,我会选择用 glass pane。具体到你的问题,最好不要在一个程序里出现多于一个 JFrame,用 modal 的 JDialog。
    谢谢提醒 的确是和线程有关的问题 但是我换回用Timer的方式了 情况还是一样 现在就是在父线程生成loading效果的弹框,然后new一个新的线程执行一耗时任务,并在执行完后将父线程中生成的loading弹框关掉。
    问题来了:如果主线程在生成弹框后的代码中没有类似sleep,wait,await这样的阻塞代码,能达到我要的显示效果。
    但是这个不符合我的逻辑呀,父线程中后面的代码需要用到子线程中任务的结果,不等待子线程完成的话会有空指针。但是一旦采用阻塞父线程来等待子线程完成然后唤醒父线程的方式,弹窗又出不来。很纠结