簡體   English   中英

設置新的jtree模型后,JTree刷新

[英]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.

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