题
我需要一种方法来等到(摇摆)的JComponent完全画。该实际问题是由一个应用openmap:任务是绘制地图(mapBean)与一对夫妇层和创建从该地图的图像
不幸的是,它的明确记载,图像格式接受当前状态从地图创建图像,并有一个机会,特别是当映射变得复杂,使得mapBean,一个JComponent之前称为格式化IST,涂
虽然与本申请openmap解释的,问题是相当普遍的和假想摆动相关。现在,我只是等待一个固定的时间(一秒),但不会消除产生不完整地图的风险...
修改强>
更多的细节 - 我要开始与构建(OpenMap)MapPanel,其internallz创建MapBean(JComponent的子类)和一个MapHandler。然后我喂MapHandler与地理位置层和框架开始画“上”在JComponent类型MapBean的地理数据。
将所有层,以将地图后,我使用另一个框架类来创建JPG图像(或:字节[]保持该图像数据)。而这个的可能会导致问题,如果我不要等待:这个“形象的创造者”创建从地图bean的当前状态的图像,如果我把这称为“图像制作者”早期,一些地图图层不涂和失踪。烦...
解决方案
java.awt.EventQueue.invokeLater
将让你的绘制操作完成后运行任务。如果它是做某种异步的负载,那么这将是特定API(如MediaTracker
确实为Image
)。
其他提示
您也可以尝试使用屏幕外缓冲区来呈现图像:
MapBean map = new MapBean();
map.setData(...);
BufferedImage bi = new BufferedImage(...);
map.paintComponent(bi.getGraphics());
writeToFile(bi);
这听起来像你需要同步与Swing的绘制循环更新的JComponent的基础数据。你也可以继承你的JComponent和装饰paintComponent()
方法,你也可以看看ImageObserver.imageUpdate()
,虽然我不知道这是要告诉你,你想要什么。
public class DrawingCycleAwareComponent extends MyOtherJComponent {
private final Object m_synchLock = new Object();
protected void paintComponent(Graphics g) {
synchronized (m_synchLock) {
super.paintComponent(g);
}
}
protected void updateData(Object data) {
if (SwingUtilities.isEventDispatchThread()) {
reallySetMyData(data); // don't deadlock yourself if running in swing
}
else {
synchronized (m_synchLock) {
reallySetMyData(data);
}
}
}
}