簡體   English   中英

在 JavaFx 中,場景圖的渲染是如何執行或觸發的

[英]In JavaFx how is rendering of a scene graph carried out or triggered

我試圖了解節點是如何在 JavaFX 中呈現到屏幕上的,以及什么觸發了這個過程,因為我想在 JavaFx 中創建一個自定義控件。 我有使用 Android 的View類的經驗,其中View的繪制與在 JavaFX 中繪制場景圖不同。

例如在 Android 中,我可以創建一個自定義View並覆蓋onDraw(Canvas canvas)方法。 onDraw()中,我可以通過在Canvas對象上繪制目錄來放置我所有的繪圖要求。 該方法在 UI 線程上調用,一旦onDraw完成,畫布就會自動顯示。 如果在 GUI 線程上,我可以通過調用視圖的invalidate()方法隨時觸發重新繪制視圖,否則調用postInvalidate()

在 JavaFx 中,我不使用 Canvas 對象,而是使用 Node 對象,據我所知,沒有等效的onDraw() 因此,如果我要創建自定義 Control,我將擴展Control類並創建一個擴展SkinBase的類。 SkinBase類是我通過創建各種 Node 對象來創建自定義控件“外觀”的地方。 但是之后:

  1. 我如何處理這些 Node 對象來實際渲染它們?
  2. 如果我需要更改節點之一的某些屬性(例如其顏色)怎么辦?
  3. 如何使皮膚“無效”以使其從 GUI 或其他線程重新呈現?

很明顯,我試圖與 Android 的 View 類的工作方式進行比較,這可能會混淆 Android 和 JavaFx 渲染過程的工作方式,但 Android 是我的知識起點。

  1. 無:一旦節點成為場景圖的一部分,FX 渲染系統就會渲染它們
  2. 再次,什么都沒有。 JavaFX 有一個可觀察的屬性 API 影響外觀的節點屬性由這些可觀察的屬性表示。 因此,如果屬性發生變化,則會觀察到該變化,並且 FX 渲染系統知道在下一個渲染脈沖上重新渲染節點。
  3. 您必須從 FX 應用程序線程執行此操作。 在 2. 中,您只需更改屬性的值,節點(及其在場景圖中的祖先節點)將自動失效。 同樣,作為場景圖一部分的節點的更改必須發生在 FX 應用線程上。 您可以使用Platform.runLater(...)安排代碼從后台線程(或使用JavaFX 並發 API )在 FX 應用程序線程上執行。

暫無
暫無

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

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