2016-11-02 4 views
0

I 1 im Wert von x hinzufügen möchten (piece.x) nach Komponente neu zu streichen, aber es frischt nach x 1 in das HinzufügenWarum repaint() Anweisung ausgeführt wird, nachdem nächste Anweisung

Was ich brauche, ist eigentlich zu malen Komponente mit dem gegebenen Wert (var) und der Wert der piece.x zu ändern, nachdem Neulackierung Komponente

piece.x = var; 
repaint(); 
piece.x += 1 

Added

ich habe einen Kasten (Rechteck), die rechte & links bewegt (auf der x-Achse) jedes s econd (die Neulackierung erfordert), aber ich möchte die Position (Wert der X-Achse) dieser Box nach dem Neuanstrich ändern

repaint einfach die Box mit dem vorhandenen Wert von x und ändern Sie dann ihren Wert, aber es ändert sich zuerst und dann repaints

Danke!

+0

versuchen, validate() vor dem Repaint aufzurufen. aber in jedem Fall ist es eine schlechte Idee, zu hoffen, dass der veränderte Wert in Bezug auf das Malen nicht versehentlich neu gestrichen wird. – rustot

+0

Der Versuch, etwas mit dem Farbmechanismus zu synchronisieren, ist in den meisten Fällen ein Zeichen für einen Designfehler. Sie sollten genauer beschreiben, was Sie eigentlich * erreichen * wollen. – Marco13

+0

@ Marco13 nur um den Wert von x nach der Neulackierung zu ändern –

Antwort

0

Warum: Repaint passiert in einem separaten Thread und plant nur Neulackierungen. JComponent.paintImmediately(...); kann verwendet werden, um ein Repaint zu erzwingen, ohne es in der Paint-Warteschlange zu planen.

piece.x = var; // This happens immediately 
repaint(); // This schedules the repaint in a separate thread 
piece.x += 1 // This isn't guaranteed to happen before or after the repaint 

Einige Leute haben Zeitverzögerungen verwendet für die repaint zu versuchen und warten, bevor Sie fortfahren, ihre Ausführung zu beenden.

Es ist wahrscheinlich besser zu bewerten, warum Sie die Variable nur inkrementieren müssen, nachdem das Repaint beendet ist und sehen, ob Sie Ihr Design/Ihre Logik ändern können, um die Neulackierung in einem separaten Thread zu ermöglichen.

+0

Ich habe auch versucht 'thread.sleep' aber passiert das gleiche –

+0

Es gibt keine Garantie, wie lange es dauern wird oder wie bald es fertig ist. Also schlaf deinen Thread nur raten, wie lange es dauern kann. Sie können also lange genug warten oder nicht. –

+0

Repaint() Anweisungen warten bis 'thread.sleep' ausgeführt wird –

-1

Wie Andrew darauf hingewiesen, der Grund von warum die Neulackierung passiert nach der Änderung der X-Wert ist einfach: Der repaint() Aufruf führt nicht dazu, den Inhalt sofort gemalt werden. Es teilt dem Windowing-System nur mit, die Komponente so schnell wie möglich neu zu zeichnen. Dies kann jedoch einige Millisekunden später auf einem anderen Thread geschehen.

Weitere Details finden Sie beispielsweise unter http://www.oracle.com/technetwork/java/painting-140037.html.

Basierend auf der Beschreibung des eigentlichen Ziels, obwohl es immer noch vage ist:

Ich habe einen Kasten (Rechteck), die rechts & links bewegt (auf x-Achse) in jeder Sekunde (was erfordert, neu zu streichen), aber ich mag die Position (Wert der x-Achse) dieses Feld ändern, nachdem

Es ist noch nicht klar, warum der x-Wert neu zu streichen nach Neulackierung ändern soll. Was passiert, nachdem sich der x-Wert geändert hat? Warum sollte es nicht auf die Position gemalt werden, die es tatsächlich hat, wenn es gemalt wird?

Die letzte Frage könnte jedoch bereits zu einer möglichen Antwort führen: Wenn Sie zwischen einer "echten" Position und einer "malen" Position unterscheiden wollen, können Sie dies explizit und übersichtlich modellieren: Zusätzlich zum aktuellen x Variable, könnte die Klasse ein Feld haben, das paintX genannt werden kann. Es ist die Position, an der die Box gemalt werden sollte, unabhängig von dem Wert, den x derzeit hat.

Natürlich klingt das fummelig, und der Grund, warum Sie dies tun müssen, ist, dass das Modell und die Ansicht nicht klar getrennt sind. Aber auf jeden Fall, bedenken Sie, dass selbst wenn Sie das Objekt zu bemalen zwingen könnte und ändern Sie den x-Wert nach das Objekt wurde gemalt, müssen Sie daran denken, dass es dann wieder lackiert werden kann die neue x-Position. Sie können nicht verhindern, dass das Fenster neu gezeichnet wird, und dies liegt außerhalb Ihrer Kontrolle.

+1

Ich freue mich auf die" nützliche "Antwort, die der Downvoter hoffentlich bald veröffentlicht. – Marco13

Verwandte Themen