如题

解决方案 »

  1.   

    awt重量级组件的peer对象是什么时候创建的?难到没有高手指点吗?
      

  2.   

    执行addNotify()方法时候,也就是与具体图形设备绑定的时候。
      

  3.   

    那addNotify()是什么时候调用的?在new UI的时候还是在setVisible(true)的时候?
    现在我写的程序必须由程序直接调用addNodify()方法,这样做不好但是也是没有办法。
    那执行addNodify()是否为异步的呢?也就是说peer的产生对于程序来说是不是异步的?
    比如线程A中显示的调用某个组件的addNotify()方法,那么在peer对象构造出来之前是不是程序会接着执行下一行?
    比如
    component.addNotify();
    int count=0;
    程序会等待component.addNotify();这句执行完再往下执行int count=0;这句吗?
    API上说“在 Window 上调用 setVisible(true),Frame 或 Dialog 可能异步出现。”
    那是不是peer的产生也有可能是异步的呢?
      

  4.   

    setVisible(true)是异步的,组件的显示和重绘也是基于消息驱动模式的,当执行setVisible(true)时仅仅是给虚拟机消息队列线程发出了一个“绘制”的消息,并不代表此方法执行完就立即显示。
    addNodify()不是异步的,此方法执行之后跟图形设备相关的对象就会被初始化,比如Peer和Graphics。
      

  5.   

    CustomFormTableEditorDialog cfted = new CustomFormTableEditorDialog(pobjectNames[i],"",s,ClientUtility.getMainFrame());
                    cfted._strObjName=pobjectNames[i];
            cfted._strFileName=s;
            cfted.setCustomFormUtility(_cfu);
            cfted.setModal(true);
                                            cfted.addNotify();
            //cfted.setVisible(true);
            //cfted.dispose();
            CustomFormEditorCanvas cfec_1=cfted._f;
            //Thread.sleep(50);
    cfted.OpenTableFile(s);
    那你看下我这段代码,为什么把Thread.sleep(50);加上程序就能运行,而不加的话程序就报错?
    OpenTableFile(s)是通过本地peer对象对打开本地一个文件。
    如果把Thread.sleep(50);加上就能正常运行,而去问题就出在cfted.addNotify();和cfted.OpenTableFile(s);我都调试过了
    而去如果DEBUG的话不加Thread.sleep(50);也能正常云新,我就感觉是cfted.addNotify();这个方法还没有完成,就执行cfted.OpenTableFile(s);了。
      

  6.   

    刚看了下JDK,是我错了,addNodify()是异步的
      

  7.   

    我靠,那怎么给addNotify方法加同步啊,晕死!
      

  8.   

    又琢磨了下,你试试:cfted.addHierarchyListener(new HierarchyListener() {
    @Override
    public void hierarchyChanged(HierarchyEvent e) {
    if (e.getChangeFlags() == HierarchyEvent.DISPLAYABILITY_CHANGED) {
    //在此处同步,此时addNotify方法达到的效果已完成
    }
    }
    });
      

  9.   

    试了仍旧不行,要是能知道addNotify什么时候完成就好了。
    这样就可以用wait了