Java 如何通知树模型其基础模型已更改?

Java 如何通知树模型其基础模型已更改?,java,swing,model-view-controller,jtree,Java,Swing,Model View Controller,Jtree,我正在开发一个世界模拟,其中世界表示为: public class World { Turtle turtle; // .. basic constructors, getters, setters } public class Turtle { List<Turtle> turtles; // .. basic constructors, getters, setters } 而海龟表示为: public class World { Tu

我正在开发一个世界模拟,其中
世界
表示为:

public class World {
    Turtle turtle;
    // .. basic constructors, getters, setters
}
public class Turtle {
    List<Turtle> turtles;
    // .. basic constructors, getters, setters
}
海龟
表示为:

public class World {
    Turtle turtle;
    // .. basic constructors, getters, setters
}
public class Turtle {
    List<Turtle> turtles;
    // .. basic constructors, getters, setters
}
在我更改最初传递给TreeModel的构造函数的
Turtle
之前,它一直工作得非常出色:

world.getTurtle().removeAllTurtleChildren();
如何更新我的JList以反映此更改?我必须创建一个新的树模型并重新设置吗


(如果可能,我希望远离DefaultTreeModel。)

添加支持修改模型结构的api:

public class WorldModel implements TreeModel {

     ...

     public void removeAllChildren(Turtle parent) {
         if (parent.getChildCount() == 0) return;
         Turtle[] children = parent.getChildren();
         int[] locations = new int[children.length());
         for(int loc = 0; loc < locations.length; loc++) {
            locations[i] = i;
         }
         parent.removeAllChildren();
         List<Turtle> path = new ArrayList<>();
         while (parent != null) {
             path.add(0, parent);
             parent = parent.getParent();
         }

         TreeModelEvent event = new TreeModelEvent(this, path, locations, children);
         // for each listener
              listener.treeNodesRemoved(event);   
     }
}
公共类WorldModel实现TreeModel{
...
公共无效删除所有子项(海龟父项){
如果(parent.getChildCount()==0)返回;
Turtle[]children=parent.getChildren();
int[]位置=新的int[children.length());
对于(int loc=0;loc

如您所见,这是一项相当艰巨的工作-您可能会重新考虑不使用DefaultTreeModel:-)

添加支持修改模型结构的api:

public class WorldModel implements TreeModel {

     ...

     public void removeAllChildren(Turtle parent) {
         if (parent.getChildCount() == 0) return;
         Turtle[] children = parent.getChildren();
         int[] locations = new int[children.length());
         for(int loc = 0; loc < locations.length; loc++) {
            locations[i] = i;
         }
         parent.removeAllChildren();
         List<Turtle> path = new ArrayList<>();
         while (parent != null) {
             path.add(0, parent);
             parent = parent.getParent();
         }

         TreeModelEvent event = new TreeModelEvent(this, path, locations, children);
         // for each listener
              listener.treeNodesRemoved(event);   
     }
}
公共类WorldModel实现TreeModel{
...
公共无效删除所有子项(海龟父项){
如果(parent.getChildCount()==0)返回;
Turtle[]children=parent.getChildren();
int[]位置=新的int[children.length());
对于(int loc=0;loc

如您所见,这是一项相当大的工作-您可能会重新考虑不使用DefaultTreeModel:-)

TreeModel
有两个重要的方法
addTreeModelListener
removeTreeModelListener
。您需要构造适当的事件,并将modelFpr示例的状态更改通知任何注册的侦听器请参见
DefaultTreeModel
如何使用
listenerList
。为什么要远离DefaultTreeModel?有什么具体原因吗?
TreeModel
有两个重要方法
addTreeModelListener
removeTreeModelListener
。您需要构造适当的事件并通知任何已注册的listeners关于modelFpr示例状态的更改,请参见
DefaultTreeModel
如何使用
listenerList
。您为什么要远离DefaultTreeModel?有什么具体原因吗?这看起来像是我在世界级上的任何工作的重复。很可能是(没有看到,所以只是猜测)世界是可观察的吗?或者说世界是可观察的吗?即使是这样:模型的通知契约没有(如零,Zlich)方法。它只是必须通知它的观察者。这似乎是我在世界级上的任何工作的重复。它很可能(没有看到,所以只是猜测)世界是可观测的吗?或者说世界是可观测的吗?即使是这样:模型的通知契约也没有(如零,Zlich)方法。它只是必须通知它的观察者。