Wie Sie sagen, wenn Grafiken.drawImage() tatsächlich abgeschlossen hat
Dies ist meine erste Frage hier und ich hoffe ich bekomme eine Antwort oder eine Idee, die mir helfen wird.
Ich bin Zeichnung ein großes Bild und skalieren Sie es nach unten mit der Methode drawImage(). Ich habe dann sofort zeichnen ein anderes Bild mit drawImage (), dass ich erwarte, dass gezeichnet werden, der auf der Oberseite des vorherigen (zweiten). Das problem ist, dass drawImage sofort zurückkehrt, auch wenn es dauert ~50 ms zu skalieren und zu Rendern, das erste Bild. Die meisten der Zeit, das zweite Bild landet unter den ersten, weil es gemalt ersten während große ersten verarbeitet werden. Im Grunde ist es sowieso zu zwingen drawImage() blockiert, bis es fertig ist, oder irgendwie schauen, Wann es abgeschlossen ist?
Ich bin mir bewusst, der ImageObserver parameter, welche gut funktioniert, wenn das herunterladen eines Bildes aus dem Internet oder so etwas, aber wenn eine bereits geladene BufferedImage, es wird nie ausgelöst ImageUpdate() nur nach dem skalieren und zeichnen. Im Grunde seit das erste Bild ist schon "geladen" nie Kontakte der ImageObserver, es dauert nur wie ~50 ms in einem eigenen thread zu verarbeiten, niemals die Benachrichtigung, wenn es abgeschlossen ist.
Weiß jemand, wie man entweder die Kraft, es zu blockieren oder zu warten, bis es komplett fertig, die Skalierung und das blitting eines Bildes? Und natürlich mit Gewinde.sleep(xx) ist ein kompletter hack und nicht lebensfähig aufgrund der Unterschiede zwischen computer-Geschwindigkeiten. Alle diese übergabe passiert ist, ist auf der Event-thread innerhalb der paint(Graphics g) - Methode.
Dank!
EDIT: Das folgende ist der code, den ich derzeit habe, um Ihnen eine Vorstellung von dem Problem:
public void paint(Graphics window)
{
window.setColor(Color.WHITE);
window.fillRect(0, 0, Settings.width * Settings.aaFactor, Settings.height * Settings.aaFactor);
Graphics2D window2D = (Graphics2D) window;
window2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
window2D.drawImage(this.image, 0, 0, Settings.width, Settings.height, null);
try
{
Thread.sleep(50);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
window2D.drawImage(this.image2, 0, 0, null);
repaint();
}
EDIT 2: Um besser zu erklären, das problem, das ich spreche, ich habe einige Beispiel-code, der tut besser, was ich versuche zu erklären. Starten Sie es und Sie werden sehen, dass es flackert, wo manchmal das erste Bild ist unten (wie es sein soll), aber die meisten der Zeit, wird es eine Obere (zweite), was aber falsch ist. Ändern Sie einfach die Datei-Pfade auf ein kleines Bild und ein großes Bild.
public class Main extends Applet implements ImageObserver
{
private BufferedImage imageA;
private BufferedImage imageB;
@Override
public void init()
{
try
{
this.imageA = ImageIO.read(new File("C:\\LargeImage.jpg"));
this.imageB = ImageIO.read(new File("C:\\SmallImage.jpg"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
@Override
public void update(Graphics g)
{
paint(g);
}
@Override
public void paint(Graphics g)
{
Graphics2D w = (Graphics2D) g;
w.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
w.drawImage(this.imageA, 0, 0, 50, 50, this);//This takes a while to do (scaling down and drawing)...
w.drawImage(this.imageB, 10, 10, null);//While this is drawn quickly, before A is done.
repaint();
}
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
{
System.out.println("ImageObserver fired, done drawing image. NEVER CALLED!");
return false;
}
}
- Ich kann nicht feststellen, Wann wird Java Rendern der out-put des Graphics-Objekts. Die eine Sache kann man sich sicher ist, es wird nicht passieren, bis NACH der paint-Methode zurückgegeben wird, damit der Thread.schlafen tut nichts anderes, dann verlangsamen Sie Ihr Programm. Wenn Sie malen werden, durch die eine Komponente von einer Art, übergeben es an die drawInage-Methode als ImageObserver & lassen Sie es zu aktualisieren, selbst, wenn es fertig ist. Die andere Wahl ist, um das Bild zu skalieren, in einem hintergrund-thread
public class Main extends Applet..
Das funktioniert hier nicht, da dieses applet verwendet Bilder, die nicht auf dem lokalen Datenträger. Applets sind auch schwieriger für die Menschen zu laufen, als Anwendungen. Ich schlage vor, Sie buchen eine frame-basierte SSCCE, die entweder hot-links zu Bildern oder erzeugt Sie in code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Letzte argument für
drawImage
(wo Sie gehen null) ist einImageObserver
. Wenn Sie Ihre eigene Implementierung dieser Schnittstelle (siehe JavaDoc), werden Sie darüber informiert, wenn das Bild wurde tatsächlich gezogen.Ist es unmöglich zu wissen, wenn Sie Schwingen wird Rendern der Inhalt einer
Graphics
- Objekt auf dem Bildschirm. Was ist weiß, ist es nicht geschehen, bis NACH derpaint
Methoden zurückzukehren (wie es derGraphics
Objekt noch nicht abgeschlossen ist, für das Rendern, bis es funktioniert).Was Sie tun sollten ist, lassen Sie die
Component
Sie malen, um die Entscheidung, Wann etwas getan werden muss, aktualisiert, dies ist die Art und Weise es entworfen wurde,... (Component
implementiertImageObserver
)Dem Beispiel weiter unten werden kontinuierlich re-skaliert das master-hintergrund-Bild, als der Rahmen in der Größe geändert wird
Während ich bin sicher, Sie haben Ihre Gründe, ich persönlich würde vermeiden
Applet
zu Gunsten vonJApplet
und in der Tat, würde ich persönlich vermeiden, applets oder zusammen. Ich begann meine Karriere Codierung applets, Sie sind einfach ein Schmerz, vor allem, wenn alles, was Sie zu tun versuchen, ist eine Idee ausprobiert.