[英]JTree refreshing after setting new jtree model
我正在嘗試使用動態JTree組件。 在根節點下,我有四個節點,其中一個節點(“操作”)可以有0到多個子節點。 這是由用戶通過可編輯列表在用戶請求打開的單獨窗口中設置的。 編輯此列表后,用戶點擊“保存”按鈕,然后就會發生魔法。 編輯列表被發送到服務器(實際上在同一台機器上,所以它不需要很長時間),帶有列表的窗口關閉但在此之前主窗口(帶有jtree)被告知刷新自己,我可以看到它會執行日志輸出中的操作,但更改不會顯示在屏幕上。
我正在使用DefaultTreeModel,調用此方法以在開始時(首次打開窗口時)創建模型,並在更改后使用新結構更新新模型。 使用dmtn.getLeafCount()我可以看到從服務器新下載的結構是正確的,在“操作”下更改了葉子數
public DefaultTreeModel getDataStructure() {
int dataID = task.getData().getId();
LoggerUtility.logger.info("Data ID: " + dataID);
DefaultMutableTreeNode dmtn = Manager.manager.getDataStructure(task.getId());
LoggerUtility.logger.info("DTMN created "+dmtn.getLeafCount());
return new DefaultTreeModel(dmtn);
}
用於刷新jtree的方法看起來像這樣(它非常混亂):
public void updateTree(){
taskDataTree.setModel(getDataStructure());
((DefaultTreeModel)taskDataTree.getModel()).reload();
this.revalidate();
this.repaint();
taskDataTree.revalidate();
taskDataTree.repaint();
taskDataTree.updateUI();
taskDataTree.setVisible(false);
taskDataTree.setVisible(true);
jScrollPane2.setViewportView(taskDataTree);
}
這是非常混亂的,因為我試圖在我的論壇上找到我的問題的每個可能的解決方案,我也嘗試使用我自己的treemodel實現,它將調用fireTreeStructureChanged(...),但它也沒有改變。
我可能還應該補充說,我正在使用Netbeans GUI Builder構建我的gui,雖然我不知道它是否與此有關。
我將非常感謝任何幫助
BR Lucja
編輯!!! 我也試過把它放在另一個這樣的線程中:
public void updateTree() {
SwingWorker sw = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
taskDataTree.setModel(getDataStructure());
((DefaultTreeModel) taskDataTree.getModel()).reload();
taskDataTree.revalidate();
taskDataTree.repaint();
taskDataTree.updateUI();
taskDataTree.setVisible(false);
taskDataTree.setVisible(true);
jScrollPane2.setViewportView(taskDataTree);
return null;
}
};
sw.execute();
}
但它也沒有幫助。
tree.setModel( anotherModel );
是您需要的唯一代碼行。
如果它不起作用則表示樹變量不包含對添加到GUI的樹的引用。 也許你有一個類變量和一個同名的局部變量。
從我的角度來看,自己的TreeModel
實現是一種很好的方法。 但我知道用正確的數據創建TreeModelEvent
並不那么簡單。
我建議您使用TreeModel實現更新您的問題,以便我們可以找到它的問題。
原則上它應該以這種方式工作(當你設置一個新模型時,樹重新加載自己)。 (這不是最有效的方法,更好的是讓模型在發生變化時發送相應的事件。)
如果這不起作用,請確保在AWT事件調度線程中調用setModel
方法(例如,使用EventQueue.invokeLater
(或SwingUtilities.invokeLater
),我認為您不應該需要所有revalidate()
, repaint()
等調用(只有在你改變了外觀配置時才應該執行updateUI
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.