![](/img/trans.png)
[英]How to get components rendered inside JTree (Swing Component Hierachy)
[英]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循環/引入排序來更改偵聽器的處理順序。
上面鏈接的教程中的DynamicTreeDemo
和DynamicTree
為自己進行測試提供了良好的基礎,因為它們提供了編輯,插入和刪除樹節點以及通過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.