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)方法。它只是必须通知它的观察者。