2012-04-26 27 views
0

我正在使用JUNG或Prefuse從GraphML源文件渲染圖形。現在另一個程序使用新的節點和邊來定期更新這個源文件。我想更新圖表以反映這些更改。我無法在兩個API中找到任何讓我這樣做的事情(沒有適當的刷新(TIMER)或重繪(TIMER)類方法)。這樣做的一種方式可能是在一段時間後終止JFrame,並重新完成整個數據加載,可視化和渲染過程,但這對我來說似乎不合適。如何在源GraphML文件被修改時更新Prefuse或JUNG圖形?

所以問題是,最簡單,儘可能快地做到這一點的最好方法是什麼?謝謝:)

回答

1

「定期」檢查源文件。如果您使用該文件的句柄f,則可以查詢f.lastModified(),如果其他程序自上次檢查以來已經完成了其骯髒工作,請更新!如果其他程序僅寫入更新文件(如果您有權進行更改 - 無需讀取文件,確切知道模型中要更改什麼等),則可以使用類似的解決方案。 「定期」是一個粘滯的檢票口 - 你的情況可能很簡單,「每X(毫秒),檢查」將做。 Java中的週期性任務可以用各種方式實現 - 例如參見this other question

JUNG在更新演示中重新呈現/重新繪製,例如, this one。在文檔中鏈接的tutorial(pdf)涵蓋了第5部分中的動態更新(該部分是關於交互性的,但是當提供新信息時需要進行更新的必要條件都已涵蓋)。

+0

謝謝@Carl,我想我會按照你的方法重新渲染,雖然對於文件修改我已經嘗試了Apache FileNodelObserver和FileAlterationListener類的commons-io,它提供了更好的邏輯和操作選項。非常感謝。 – xkcd 2012-04-30 12:18:37

+0

@xkcd這些確實是替代DIY的好選擇;祝你好運。 – Carl 2012-04-30 15:04:34

0

JUNG提供包裝(ObservableGraph),允許您監聽更改。

一旦您收到更新通知,您必須更新佈局,然後刷新可視化。後者以Swing通常的方式完成。

+0

我很確定其他程序不會通過'ObservableGraph'實例修改圖形,所以不會觸發修改事件。 – Carl 2012-04-26 16:12:42

+0

沒錯。另一個程序甚至沒有意識到可視化程序的存在。它只是將數據輸入到GraphML文件中。 – xkcd 2012-04-27 16:08:14

+0

啊,我錯過了你正在談論文件的更新,而不是圖表。 – 2012-05-04 21:43:15

相關問題