gpt4 book ai didi

java - 如何知道 Swing JTree 何时呈现所有更改?

转载 作者:行者123 更新时间:2023-11-30 02:53:32 30 4
gpt4 key购买 nike

所以我修改了我的树结构并要求我的树模型重新加载它。如何知道 JTree 组件何时完成渲染更改?

最佳答案

以下 Oracle 文档对此进行了部分介绍:

<小时/>

通过添加您自己的监听器,您可以监视更改。然而,DefaultTreeModel通知更改时从最后到第一个处理监听器(来源:DefaultTreeModel):

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

因此,为了确保您的监听器在更改呈现/完成后收到通知,您需要在JTree内部已使用的监听器之后执行您的监听器。来处理变化。通过扩展DefaultTreeModel并覆盖这些方法,您可以通过修改 for 循环/引入排序来更改监听器的处理顺序

DynamicTreeDemoDynamicTree上面链接的教程为您自己进行测试提供了良好的基础,因为它们提供了编辑、插入和删除树节点的方法,以及通过 UI 完全修改树结构(清除选项)的方法。其中每一个都对应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");
}
}

关于java - 如何知道 Swing JTree 何时呈现所有更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907321/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com