2014-04-09 3 views
0

Java Swing 응용 프로그램에서 관찰 패턴을 구현하려고합니다. 내 학교 프로젝트로 작업 중입니다. 저는이 두 개의 매우 간단한 클래스를가집니다. 하나는 싱글 톤 관찰 가능 모델이고 다른 하나는 옵서버입니다.왜 옵서버에 알리지 않습니까?

관찰 가능한 모델 :

public class ModelObserver implements Observer { 

    public static Logger LOG = Logger.getLogger(ModelObserver.class); 

    @Override 
    public void update(Observable o, Object arg) { 

     if (arg instanceof Model.Actions) { 

      Model.Actions action = (Actions) arg; 

      switch (action) { 

      case SELECTED_IMAGE: 
       selectedImage(); 
       break; 

      case COLORS_COUNT: 
       colorsCount(); 
       break; 

      default: 
       LOG.warn("Not supported action: " + action); 
       break; 
      } 

     } else { 
      LOG.warn("Not supported action: " + String.valueOf(arg)); 
     } 

    } 

    private void colorsCount() { 
     LOG.info("Colors count has been changed...."); 
    } 

    private void selectedImage() { 
     LOG.info("Image has been changed...."); 
    } 

} 

모든 작품

public class Model extends Observable { 

    private static Model instance = null; 
    private File selectedImageFile; 
    private int colorsCount; 

    public static Logger LOG = Logger.getLogger(Model.class); 

    private Model() { 
     this.initialize(); 
    } 

    private void initialize() { 
     addObserver(new ModelObserver()); 
    } 

    public static Model instance() { 
     if (Model.instance == null) { 
      Model.instance = new Model(); 
     } 
     return Model.instance; 
    } 

    public void setColorsCount(int colorsCount) { 
     this.colorsCount = colorsCount; 
     notifyObservers(Actions.COLORS_COUNT); 
    } 

    public void selectedImage(File imageFile) { 
     this.selectedImageFile = imageFile; 
     notifyObservers(Actions.SELECTED_IMAGE); 
    } 

    public enum Actions { 
     SELECTED_IMAGE, COLORS_COUNT 
    } 

} 

관찰자 - (내 경우에는 하나의) 모델 인스턴스 레지스터 변화하지만, 관찰자는 통지하지 않습니다. 방법 ModeObserver.update(Observable o, Object arg)에는 모델이 변경되었다는 언급이 없습니다. 그래서 내 문제는 관찰자에게 알리지 않는다는 것입니다.

내가 뭘 잘못하고 있니? 고맙습니다.

+1

더 빨리 도움을 받으려면 SSCCE를 게시하십시오. –

답변

3

실제로는 알림을 수행하려면 notifyObservers에서 필요로하는 관찰 가능 항목을 변경된 것으로 표시하는 것을 잊었습니다.

관련 문제