2013-02-26 3 views
1

Я разрабатываю имитацию мира, где World представлена:Как уведомить TreeModel о том, что его базовая модель изменилась?

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

и Turtle представлено:

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

где а Turtle стоит на спинах его 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, если это возможно.)

+2

'TreeModel' имеет два важных метода: addTreeModelListener и' removeTreeModelListener'. Вам нужно создать соответствующие события и уведомить зарегистрированных пользователей о изменении состояния модели – MadProgrammer

+1

Пример Fpr, посмотрите, как 'DefaultTreeModel' использует' listenerList'. – trashgod

+0

Почему вы хотите остаться в стороне от DefaultTreeModel? Любые конкретные причины для этого? –

ответ

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 :-)

+0

Это похоже на дублирование любой работы, которую я буду иметь в своем классе World. – sdasdadas

+1

это, скорее всего, (не видите, так что просто догадываться) нет - или мир можно наблюдать ?. Даже если это так: существует _no_ (как в ноль, zilch) путь вокруг контракта уведомления модели. Он просто ДОЛЖЕН уведомить своих наблюдателей. – kleopatra

+0

Я вижу ... спасибо, это имеет смысл. – sdasdadas