2016-11-02 70 views
0

我想在X(piece.x)的值重繪組件後加1之後執行,但在X加1後重新繪製爲什麼重繪()語句下面的語句

我其實需要的是油漆與向右移動左&(上x軸)的給定值(VAR)和重新油漆組分

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

新增

我有一個盒(矩形)之後改變piece.x的值分量每一個econd(需要重繪),但是我想在重新繪製後更改該框的位置(x軸的值)

只需用現有值x重新繪製框,然後更改它的值,但它先改變然後重新塗漆

謝謝!

+0

嘗試在重繪之前調用validate()。但是在任何劇組中,希望改變與繪畫有關的價值不會被意外重新粉刷的想法是不好的 – rustot

+0

在大多數情況下,試圖與繪畫機制同步某些東西是設計缺陷的標誌。你應該更詳細地描述你實際想要達到的目標。 – Marco13

+0

@ Marco13只是爲了在重新繪製後更改x的值 –

回答

0

原因:重繪發生在一個單獨的線程中,並且只安排重新繪製。 JComponent.paintImmediately(...);可用於強制重繪,而無需在繪畫隊列的後面安排它。

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 

有人曾用時間延遲,試圖等待重繪繼續其執行前完成。

評估爲什麼你需要在重繪完成後只增加變量,看看你是否可以改變你的設計/邏輯以適應重新繪製單獨線程的情況。

+0

我也嘗試過'thread.sleep',但是發生同樣的情況 –

+0

不能保證需要多長時間或者多快完成。所以睡覺你的線程只是猜測它可能需要多長時間。所以你可能會也可能不會等待足夠長的時間。 –

+0

repaint()語句一直等到'thread.sleep'執行 –

-1

正如Andrew指出的那樣,爲什麼改變x值後發生重繪很簡單:repaint()調用不會導致內容被立即着色。它只告訴窗口系統儘快重新繪製組件。但是這可能會在幾毫秒後發生在不同的線程上。

有關更多詳細信息,例如,可以查看http://www.oracle.com/technetwork/java/painting-140037.html

基於實際目標的描述中,儘管它仍然是模糊的:

我有一個盒(矩形),它向右移動&左(上x軸)每秒(這需要重畫),但我想改變框的位置(x軸的值)重新油漆

它仍然不清楚爲什麼x值後應重繪改變後。 x值發生變化後會發生什麼?爲什麼它不應該畫在的位置上?

但是,最後一個問題可能已經導致了一個潛在的答案:當您想區分「真實」位置和「繪畫」位置時,您可以明確且清晰地對此進行建模:除當前的x變量,該類可能有一個字段,可能被稱爲paintX。無論x目前有什麼價值,這是盒子應該塗漆的位置。

當然,這聽起來很煩瑣,你爲什麼要這樣做的原因是模型和視圖沒有明確分開。但無論如何,請記住,即使如果您可以強制要繪製的對象並在之後更改對象被繪製後的x值,您必須考慮它可能會再繪製,在處新的x位置。你無法防止窗口被重新粉刷,這超出了你的控制範圍。

+1

我期待看到downvoter很快就會發布的「有用」答案。 – Marco13