Frage

ich brauche eine Art und Weise, bis eine (Swing) warten JComponent vollständig gestrichen. Das eigentliche Problem ergibt sich aus einer OpenMap Anwendung. Die Aufgabe ist es, eine Karte (mapBean) mit einem paar Schichten zu ziehen und ein Bild von dieser Karte erstellen

Leider, und es ist klar dokumentiert, das Bildformatierer den aktuellen Zustand von der Karte nimmt das Bild zu erstellen, und es gibt eine Chance, vor allem, wenn Karten komplex werden, dass die Forma ist vor dem mapBean genannt, ein JComponent, gemalt .

Obwohl mit dieser OpenMap Anwendung erläutert, ist das Problem ganz allgemein und angeblich im Zusammenhang schwingen. Gerade jetzt, ich warte nur eine feste Zeit (eine Sekunde), aber das nicht beseitigt die Gefahr der Schaffung von unvollständigen Karten ...

Bearbeiten

Einige weitere Details - Ich habe mit der Konstruktion eines (OpenMap) MapPanel beginnen, die internallz eine MapBean (JComponent Unterklasse) erzeugt und eine MapHandler. Dann fütterte ich die MapHandler mit geografischen Ebenen und das Rahmen startet die geographischen Daten Malerei ‚auf‘ dem JComponent Typ MapBean.

Nach dem Hinzufügen aller Schichten auf die Karte, verwende ich eine anderen Rahmen Klasse ein JPG-Bild zu erstellen (oder: das byte [], dass die Bilddaten enthält). Und das können Probleme verursachen, wenn ich nicht warten: das ‚Image Creator‘ erzeugt das Bild aus dem aktuellen Zustand der Karte Bohne, und wenn ich nenne das ‚Image Creator‘ zu früh, einig Kartenebenen sind nicht lackiert und fehlt. Ziemlich ärgerlich ...

War es hilfreich?

Lösung

java.awt.EventQueue.invokeLater ermöglicht es Ihnen, eine Aufgabe auszuführen, nachdem der Lack Operation beendet ist. Wenn es irgendeine Art von asynchroner Last tut, dann wird es API spezifisch sein (wie MediaTracker tut für Image).

Andere Tipps

Das könnte Sie auch einen Off-Screen-Puffer versuchen Sie es mit Ihrem Bild machen in:

 MapBean map = new MapBean();
 map.setData(...);

 BufferedImage bi = new BufferedImage(...);
 map.paintComponent(bi.getGraphics());

 writeToFile(bi);

Es klingt wie Sie benötigen JComponent zugrunde liegenden Daten mit Swing Farbe Zyklus zu synchronisieren, zu aktualisieren. Sie können Ihre JComponent und dekorieren die paintComponent() Methode Unterklasse, können Sie auch bei ImageObserver.imageUpdate() aussehen, obwohl ich nicht sicher bin, ob, dass Sie geht sagen, was Sie wollen.

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);
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top