2013-02-26 1 views
1

내가 World에 의해 표현되는 세계의 시뮬레이션을 개발하고 :기본 모델이 변경되었다는 것을 TreeModel에 어떻게 알릴 수 있습니까?

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

turtles의 백업에 Turtle 스탠드 및 :

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

Turtle하는로 표현된다 World은 주 Turtle (누구 아래에 거북이가있을 수 있습니다)에 달려 있습니다. Swing에서 이것을 JTree로 표현하고 싶습니다.

그래서 나는 JTree가하고있는 TreeModel까지 코드 :

world.getTurtle().removeAllTurtleChildren(); 

:

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 


} 

이 화려 내가 처음하는 TreeModel의 생성자에 전달 된 Turtle을 변경하는 지점까지 작동을 이 변경을 반영하도록 (듯이) JList를 어떻게 갱신합니까? 새 TreeModel을 만들고 다시 설정해야합니까?

(나는 가능하면 멀리 DefaultTreeModel의에서 체재하고 싶습니다.)

+2

'TreeModel'에는 두 가지 중요한 메소드'addTreeModelListener'와'removeTreeModelListener'가 있습니다. 적절한 이벤트를 구성하고 등록 된 리스너에게 모델의 상태 변경에 대해 알릴 필요가 있습니다. – MadProgrammer

+1

예를 들어'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

월드 클래스에서 할 일이 중복 된 것처럼 보입니다. – sdasdadas

+1

아마 그럴 것입니다 (그렇게 생각하지 않으므로 단지 짐작하지 않습니다) - 아니면 세상이 관측 가능합니까? 그것이있는 경우에도 : 모델의 알림 계약과 관련하여 _no_ (0, zilch와 같이) 방법이 있습니다. 단순히 관찰자에게 반드시 알려야합니다. – kleopatra

+0

나는 ... 고마워, 이해가된다. – sdasdadas