2016-04-12 44 views
0

我正嘗試在JavaFX下創建一個自定義Canvas小部件,該小部件從大量不相關的工作線程收集信息。 「更新」事件可能有不同的速率,有時太快,有時甚至沒有,意味着需要適當解決「太快的更新」和「空閒時間」的要求。更新數量太高,因此每次執行更新時發出一個Runnable並不是一個好的解決方案。JavaFX和Canvas的快速更新

只是爲了測試,我的蠻力方法是創建一個AnimationTimer來更新Canvas對象的視覺效果。這個解決方案工作正常,但是當然有時候Canvas不需要更新,從而使整個過程效率低下。

與我的問題最接近的答案似乎是this post與GUIUpdater助手類,但畫布似乎沒有直接更新屬性。我試圖找到一種方法來用綁定的參數「插入」所需的更新功能,但運氣不錯。我甚至嘗試瞭解Canvas是否有「更新」事件,但我沒有找到它。據我所知,我發現的所有其他答案都不符合要求。

在此先感謝

編輯

這裏是我用來確保代碼,只有當數據發生變化,那麼畫布將繪製:

new AnimationTimer() { 
    @Override 
    public void handle(long now) { 
     if (needsUpdate.getAndSet(false)) { 
      myCustomCanvasRepaint(); 
     } 
    } 
}.start(); 

這是觸發類似的東西:

AtomicBoolean needsUpdate = new AtomicBoolean(true); 
... 
public void needsUpdate() { 
    needsUpdate.set(true); 
} 
+0

有關頻繁更新的相關問題:http://stackoverflow.com/questions/23488280/throttling-javafx-gui-updates –

+0

這可能會解決「太頻繁」但不是「閒置」的情況。我會更新我的問題,以顯示我使用類似方法所做的工作。 – Panayotis

+0

我不確定我是否理解「空閒」情況下的含義 –

回答

0

這是真正的Throttling javafx gui updates重複,但你可以做

private final AtomicBoolean updated = new AtomicBoolean(); 

// ... 

Thread someBackgroundThread = new Thread(() -> { 
    while (true) { 
     waitArbitraryTimeForData() ; 
     if (updated.getAndSet(false)) { 
      updateCanvas(); 
     } 
    } 
}); 

private void updateCanvas() { 
    Platform.runLater(() -> { 
     updated.set(true); 
     // repaint canvas... 
    } 
} 

根據您的更新,依靠什麼樣的數據,你可能需要圍繞Platform.runLater()的體數據的一些額外的鎖定。或者(可能更好),用不可變類代表累積更新,並用對該類的原子引用代替AtomicBoolean