1

私は、次のようWorldに表される世界のシミュレーションを開発しています。

public class World {
    Turtle turtle;
    // .. basic constructors, getters, setters
}

aTurtleは次のように表されます。

public class Turtle {
    List<Turtle> turtles;
    // .. basic constructors, getters, setters
}

aTurtleがその背中に立ち、 が1 つのメイン(その下にカメがいる場合があります) にturtlesかかっWorldています。Turtleこれを Swing で JTree として表現したいと考えています。

そこで、JTree と TreeModel をコーディングします。

JTree tree = new JTree(new WorldModel(world.getTurtle());

public class WorldModel implements TreeModel {

    private Turtle = null;

    public WorldModel(Turtle turtle) {
        this.turtle = turtle;
    }

    @Override
    int getChildCount(Object object) {
        return ((Turtle) object).getNumTurtles();
    }

    @Override
    Object getChild(Object parent, int index) {
        return ((Turtle) object).getTurtle(index);
    }

    // etc., you get the overbearing point


}

これは、Turtle最初に TreeModel のコンストラクターに渡した値を変更するまでは、うまく機能します。

world.getTurtle().removeAllTurtleChildren();

この変更を反映するように JList を更新するにはどうすればよいですか? 新しい TreeModel を作成して再度設定する必要がありますか?

(可能であれば、DefaultTreeModel から離れたいと思います。)

4

1 に答える 1

1

構造の変更をサポートする 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);   
     }
}

ご覧のとおり、かなりの作業です - DefaultTreeModel を使用しないことを再考するかもしれません :-)

于 2013-02-27T09:58:34.530 に答える