awt重量级组件的peer对象是什么时候创建的? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 awt重量级组件的peer对象是什么时候创建的?难到没有高手指点吗? 执行addNotify()方法时候,也就是与具体图形设备绑定的时候。 那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的产生也有可能是异步的呢? setVisible(true)是异步的,组件的显示和重绘也是基于消息驱动模式的,当执行setVisible(true)时仅仅是给虚拟机消息队列线程发出了一个“绘制”的消息,并不代表此方法执行完就立即显示。addNodify()不是异步的,此方法执行之后跟图形设备相关的对象就会被初始化,比如Peer和Graphics。 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);了。 刚看了下JDK,是我错了,addNodify()是异步的 我靠,那怎么给addNotify方法加同步啊,晕死! 又琢磨了下,你试试:cfted.addHierarchyListener(new HierarchyListener() { @Override public void hierarchyChanged(HierarchyEvent e) { if (e.getChangeFlags() == HierarchyEvent.DISPLAYABILITY_CHANGED) { //在此处同步,此时addNotify方法达到的效果已完成 } } }); 试了仍旧不行,要是能知道addNotify什么时候完成就好了。这样就可以用wait了 关于集合的一个小问题 eclipse的有关问题 总是找不到jar包,请大侠们帮帮忙 急急急!各位大虾!留步!java怎么给文本框添加FocusListener事件?为什么的代码编译成功了事件却联响应 tomcat自动关闭 出现EXCEPTION_ACCESS_VIOLATION 怎么解决? JFrame里动态显示其它JFrame或JPanel该如何实现? 求助! 求助关于杨辉三角的问题? 100分求together for jbuilder6.1的注册码! 请问高手~~~~谢谢来者! 小弟初学java, 此小程序有个地方不解,麻烦了各位... 难点:谁看看这个按钮怎么添加不上
现在我写的程序必须由程序直接调用addNodify()方法,这样做不好但是也是没有办法。
那执行addNodify()是否为异步的呢?也就是说peer的产生对于程序来说是不是异步的?
比如线程A中显示的调用某个组件的addNotify()方法,那么在peer对象构造出来之前是不是程序会接着执行下一行?
比如
component.addNotify();
int count=0;
程序会等待component.addNotify();这句执行完再往下执行int count=0;这句吗?
API上说“在 Window 上调用 setVisible(true),Frame 或 Dialog 可能异步出现。”
那是不是peer的产生也有可能是异步的呢?
addNodify()不是异步的,此方法执行之后跟图形设备相关的对象就会被初始化,比如Peer和Graphics。
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);了。
@Override
public void hierarchyChanged(HierarchyEvent e) {
if (e.getChangeFlags() == HierarchyEvent.DISPLAYABILITY_CHANGED) {
//在此处同步,此时addNotify方法达到的效果已完成
}
}
});
这样就可以用wait了