簡體   English   中英

如何知道Swing JTree何時呈現所有更改?

[英]How to know when the Swing JTree has rendered all changes?

因此,我修改了我的樹結構,並要求我的樹模型重新加載它。 如何知道JTree組件何時完成呈現更改?

以下Oracle文檔部分涵蓋了此內容:


通過添加自己的偵聽器,您可以監視更改。 但是,在通知更改時, DefaultTreeModel從最后到第一個處理偵聽器(來源: DefaultTreeModel ):

// Process the listeners last to first, notifying those that are interested in this event

因此,為了保證您的聽眾會的變化已經呈現/完成通知,需要經過那些已經在內部使用中要執行你的聽眾JTree處理變化。 通過擴展DefaultTreeModel並覆蓋這些方法,可以通過修改for循環/引入排序來更改偵聽器的處理順序。

上面鏈接的教程中的DynamicTreeDemoDynamicTree為自己進行測試提供了良好的基礎,因為它們提供了編輯,插入和刪除樹節點以及通過UI完全修改樹結構(clear選項)的方法。 每個都對應於必須在TreeModelListener中實現的方法


您可以通過以下示例進行測試,包括

treeModel = new CustomTreeModel(rootNode);
treeModel.addTreeModelListener(new CustomTreeModelListener());

DynamicTree構造函數中

您還可以添加其他TreeModelListener ,以確保它們按預期順序執行

模型:

class CustomTreeModel extends DefaultTreeModel{
        public CustomTreeModel(TreeNode root){
            super(root);
        }

        @Override
        protected void fireTreeNodesChanged(Object source, Object[] path,
                                            int[] childIndices, Object[] children) {

            Object[] listeners = listenerList.getListenerList();
            TreeModelEvent event = null;
            // Process the listeners first to last, notifying those that are interested in this event
            for (int index = 0; index < listeners.length; index++) {
                if (listeners[index] instanceof TreeModelListener) {
                    // Lazily create the event:
                    if (event == null)
                        event = new TreeModelEvent(source, path, childIndices, children);
                    ((TreeModelListener)listeners[index]).treeNodesChanged(event);
                }
            }
        }

        @Override
        protected void fireTreeNodesInserted(Object source, Object[] path,
                                             int[] childIndices, Object[] children) {

            Object[] listeners = listenerList.getListenerList();
            TreeModelEvent event = null;
            // Process the listeners first to last, notifying those that are interested in this event
            for (int index = 0; index < listeners.length; index++) {
                if (listeners[index] instanceof TreeModelListener) {
                    // Lazily create the event:
                    if (event == null)
                        event = new TreeModelEvent(source, path, childIndices, children);
                    ((TreeModelListener)listeners[index]).treeNodesInserted(event);
                }
            }
        }

        @Override
        protected void fireTreeNodesRemoved(Object source, Object[] path,
                                            int[] childIndices, Object[] children) {

            Object[] listeners = listenerList.getListenerList();
            TreeModelEvent event = null;
            // Process the listeners first to last, notifying those that are interested in this event
            for (int index = 0; index < listeners.length; index++) {
                if (listeners[index] instanceof TreeModelListener) {
                    // Lazily create the event:
                    if (event == null)
                        event = new TreeModelEvent(source, path, childIndices, children);
                    ((TreeModelListener)listeners[index]).treeNodesRemoved(event);
                }
            }
        }

        @Override
        protected void fireTreeStructureChanged(Object source, Object[] path,
                                                int[] childIndices, Object[] children) {

            Object[] listeners = listenerList.getListenerList();
            TreeModelEvent event = null;
            // Process the listeners first to last, notifying those that are interested in this event
            for (int index = 0; index < listeners.length; index++) {
                if (listeners[index] instanceof TreeModelListener) {
                    // Lazily create the event:
                    if (event == null)
                        event = new TreeModelEvent(source, path, childIndices, children);
                    ((TreeModelListener)listeners[index]).treeStructureChanged(event);
                }
            }
        }
    }

監聽器:

class CustomTreeModelListener implements TreeModelListener {
    public void treeNodesChanged(TreeModelEvent e) {
        DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)e.getTreePath().getLastPathComponent();
        int index = e.getChildIndices()[0];
        DefaultMutableTreeNode modifiedNode = (DefaultMutableTreeNode)(parentNode.getChildAt(index));

        System.out.println("A node on parent: " + parentNode.getUserObject()
                + " was modified to: " + modifiedNode.getUserObject());
    }

    public void treeNodesInserted(TreeModelEvent e) {
        String parentNode = e.getTreePath().getLastPathComponent().toString();
        String childNodes = Arrays.toString(e.getChildren());
        System.out.println("Node(s): " + childNodes + " inserted to parent: " + parentNode);
    }

    public void treeNodesRemoved(TreeModelEvent e) {
        String parentNode = e.getTreePath().getLastPathComponent().toString();
        String childNodes = Arrays.toString(e.getChildren());
        System.out.println("Node(s): " + childNodes + " removed from parent: " + parentNode);
    }

    public void treeStructureChanged(TreeModelEvent e) {
        System.out.println("Tree structure has been updated");
    }
}

暫無
暫無

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

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