我需要一种方法来等到(摇摆)的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);
            }
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top