2

カードゲームを作ろうとしています。

私が持っているいくつかのクラスは次のとおりです。CardModel、CardView; DeckModel、DeckView。

デッキモデルにはカードモデルのリストがあります。MVCによると、カードをデッキに送信したい場合は、カードモデルをデッキモデルに追加でき、イベントによってカードビューがデッキビューに追加されます。ハンドラ。

したがって、DeckModelクラスにaddCard(CardModel m)がありますが、そのモデルのカードビューをデッキビューに追加するイベントを送信する場合は、モデルにビューへの参照があることだけを知っています。

したがって、問題は次のとおりです。カードモデルとデッキモデルがそれを行うためにビュークラスへの参照を持っている必要がある場合はどうでしょうか。そうでない場合、それをより良くする方法は?

コードを更新します。

public class DeckModel {
private ArrayList<CardModel> cards;

private ArrayList<EventHandler> actionEventHandlerList;

public void addCard(CardModel card){
    cards.add(card);

    //processEvent(event x);
    //must I pass a event that contain card view here?
}

CardModel getCards(int index){
    return cards.get(index);

}

public synchronized void addEventHandler(EventHandler l){
    if(actionEventHandlerList == null)
        actionEventHandlerList = new ArrayList<EventHandler>();

    if(!actionEventHandlerList.contains(l))
        actionEventHandlerList.add(l);
}

public synchronized void removeEventHandler(EventHandler l){
    if(actionEventHandlerList!= null && actionEventHandlerList.contains(l))
        actionEventHandlerList.remove(l);
}

private void processEvent(Event e){
    ArrayList list;

    synchronized(this){
        if(actionEventHandlerList!= null)
            list = (ArrayList)actionEventHandlerList.clone();
        else
            return;
    }
    for(int i=0; i<actionEventHandlerList.size(); ++i){
        actionEventHandlerList.get(i).handle(e);
    }
}
}
4

1 に答える 1

1

良いMVCモデルでは、ビューについて知らないはずです。これを実現するために、コントローラーがサブスクライブするリスナーインターフェイスをモデルに提供できます。そのため、コントローラーはモデルの変更後にビューを更新できます。

JavaFXでは、次のサポートがあります:ObservableList、プロパティ、およびバインディング。ListViewでどのように行われるかを確認できます。itemsプロパティは、ObservableListそれに応じてビューを更新するListViewコントローラーによって監視されるプロパティです。したがって、のユーザーはListView何も知らずに、の要素を追加/削除/変更するだけで済みitemsます。

于 2012-09-09T07:52:09.840 に答える