2013-02-15 4 views
2

MVC Swing Java 응용 프로그램과 관련하여 질문이 있습니다.Swing 응용 프로그램의 MVC 아키텍처

Entity e은 논리와 속성, getter, setters, equals, hashCode, toString (또는 compareTo)이없는 단순한 클래스입니다. MVC에서 Model을 나타냅니다.

우리는 MainWindow보다 (MVC에서보기로) 있습니다.

e.getSomething();, e.setSomething(someValue);을 사용하거나 Element의 컬렉션을 정렬/반복해도 괜찮습니까? MainWindow에 있습니까? 따라서 일부 GUI 렌더링 및 동작을 구성 요소 수신기에서 익명 클래스 ("청취자가 없기 때문에 Listener 구현은 Controller에있을 수 없다", HTML은 리스너가 없음)가 필요합니까? 이 MVC 준수하는

... 
final Element el = Controller.getInstance().getSomeElement(); 
JButton save = new JButton(); 
JTextField field = new JTextField(el.getSomething()); 

save.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     el.setSomething(field.getText()); 
     Controller.getInstance().persist(); //let controller know some Element has changed and needs to be saved 
    } 
}); 
... 

방법이 코드 조각을 변경하려면 :

나는 MainWindow이 같은 짓을? 감사.

+1

참고 사항 [답변] (http://stackoverflow.com/a/3072979/230513). – trashgod

답변

4

어렵고 빠른 규칙은 없습니다. 종종보기와 컨트롤러가 스윙 앱에 결합됩니다.

그러나 엄격한 MVC에서는보기가 컨트롤러에 의존해서는 안됩니다. 뷰는 모델을 청취하고 그 자체를 그린 다음 구성 요소와 이벤트를 컨트롤러에 표시합니다. 컨트롤러는 이러한 이벤트에 반응하고 모델을 적절하게 변경하여 뷰를 변경합니다.

따라서, 귀하의 예제에서, 나는 다음과 같은 방법을 MainWindow를하는 것입니다 : 그것은에서 그것을 얻을하지 않도록 또한

public void addSaveListener(ActionListener l) { 
    save.addActionListener(l); 
} 

public void removeSaveListener(ActionListener l) { 
    save.removeActionListener(l); 
} 

는, 나는 MainWindow를 생성자로 요소의 인스턴스를 통과 할 것 제어 장치.

큰 응용 프로그램에서
myMainWindow.addSaveListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     el.setSomething(field.getText()); 
     persist(); // Element has changed and needs to be saved 
    } 
}); 

, 내가 대신 내가 위에 쓴의 이벤트 버스 아키텍처를 고려할 것이라고하지만, :. 컨트롤러는 컨트롤러, 그런 다음에 자신의 레퍼런스를 전달

를 MainWindow를을 만드는 것 그것은 아마도 다른 질문 일 것입니다.

관련 문제