簡體   English   中英

為什么repaint()語句在下一條語句之后執行

[英]Why repaint() statement executes after next statement

我想在重新繪制組件后在x(piece.x)的值中添加1,但在x中添加1后重新繪制

我真正需要的是用給定值(var)繪制組件,並在重新繪制組件后更改piece.x的值

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

添加

我有一個框(矩形),它每秒左右移動(在x軸上)(需要重新繪制),但是我想在重新繪制后更改該框的位置(x軸的值)

只需使用x的現有值重新繪制框,然后更改其值,但先更改然后重新繪制

謝謝 !

原因:重新繪制發生在單獨的線程中,並且僅計划重新繪制。 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

有些人使用時間延遲來嘗試等待重新繪制完成,然后再繼續執行。

最好評估一下為什么只需要在重繪完成后才增加變量,然后查看是否可以更改設計/邏輯以適應在單獨線程中發生的重繪。

安德魯指出, 為什么改變x值后重繪情況的原因很簡單: repaint()調用不會導致內容被立即塗上。 它僅告訴窗口系統盡快重新繪制組件。 但這可能會在幾毫秒后在另一個線程上發生。

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

基於對實際目標的描述,盡管它仍然模糊不清:

我有一個框(矩形),它每秒左右移動(在x軸上)(需要重新繪制),但是我想在重新繪制后更改該框的位置(x軸的值)

仍然不清楚為什么重新繪制應該更改x值。 x值更改后會發生什么? 為什么它不上的位置被畫時,它是畫,它實際上

但是,最后一個問題可能已經引發了一個潛在的答案:當您要區分“實際”位置和“繪畫”位置時,可以對此進行明確,清晰的建模:除了當前的x變量,該類可能具有一個可能稱為paintX的字段。 無論x當前具有什么值,它都是應該繪制框的位置。

當然,這聽起來很奇怪,而您可能必須這樣做的原因是模型和視圖沒有清楚地分開。 但在任何情況下,請記住, 即使你可能會迫使被繪制的對象,並改變x值的對象被畫 ,你必須考慮到它可能然后被塗一遍 ,在新的x位置。 您無法阻止重新繪制窗口,這是您無法控制的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM