2011-01-14 8 views
0

인사말,옵서버/관찰 가능한 도움말!

저는 Obserser/Observable 구현을 Model-View-Controller에 대해 연구했습니다. 패턴을 잘못 사용했을 수도 있지만 여기까지 내가 한 것입니다. 내 코드에서 . Submit 키를 누르면 모델의 makeChange()가 트리거됩니다. 그러나 테스트의 update()를 트리거하지 않습니다.

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Observable; 
import java.util.Observer; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 

public class Testing implements Observer { 

    public Testing() { 
     model.addObserver(this); 
     loadListener1();   
    } 

    private void loadListener1() { 
     view1.submitButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       model = new Model(view1.data1Field.getText(), view1.data2Field.getText()); 
       model.makeChange(); 
       model.notifyObservers(); 
      } 
     }); 
    } 

    public void update(Observable o, Object arg) { System.out.println("Notify - Observer"); } 

    public static void main(String[] a) { Testing testing = new Testing(); } 

    private View view1 = new View("1");  
    private Model model = new Model(); 

} 

class View extends JFrame { 

    public View(String frame) { 
     super("Frame: " + frame); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(300, 300); 
     setVisible(true); 
     setLayout(new GridLayout(3, 2)); 
     add(data1Label); add(data1Field); 
     add(data2Label); add(data2Field); 
     add(submitButton); add(cancelButton); 
    } 

    private final JLabel data1Label = new JLabel("Data1"); 
    private final JLabel data2Label = new JLabel("Data2"); 
     public final JTextField data1Field = new JTextField(); 
    public final JTextField data2Field = new JTextField(); 
    public final JButton submitButton = new JButton("Submit"); 
    public final JButton cancelButton = new JButton("Cancel"); 

} 

class Model extends Observable { 

    public Model() { } 
    public Model(String data1, String data2) { 
     setData1(data1); 
     setData2(data2); 
    } 
    public String getData1() { return data1; } 
    public final void setData1(String data1) { this.data1 = data1; } 
    public String getData2() { return data2; } 
    public final void setData2(String data2) { this.data2 = data2; } 
    public void makeChange() { 
     setChanged(); 
     notifyObservers(); 
     System.out.println("Notify - Observable"); 
    } 
    private String data1; 
    private String data2; 

} 

나를 안내 할 수 있습니까? 귀하의 회신은 대단히 감사하겠습니다.

감사합니다, 시릴 H. 새로운 모델에() 코드가 얼마나 되나요 통화

+1

및 알림 –

+0

없이 교차 게시 :

이 코드를 시도? –

+0

@Hovercraft :이 질문을 교차 게시하는 것에 대해 사과드립니다. –

답변

0

In clas 생성자 필드 자체 초기화 중 생성 된 Model 인스턴스에 대한 레지스터 자체 테스트.

제출 버튼의 actionPerformed 메소드에서 모델의 인스턴스를 만들고 나중에이 새로운 인스턴스에 등록 된 옵서버가없는 notifyObservers 메소드를 호출하십시오! 당신이 디버거를 사용하면 코드를 단계별로 할 때 당신은 무엇을 보는가,

private void loadListener1() { 
    view1.submitButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      model.setData1(view1.data1Field.getText()), 
      model.setData2(view1.data2Field.getText()); 
      model.makeChange(); 
     } 
    }); 
} 
+0

에 기재되어있다. ;) –

+0

고마워 ... 일했다 ... 내 코드를 지금 업데이트하려고 노력할 것이다 ... 감사 ... –

+0

나는 가장 쉬운 방법은 자식 업데이트 방법으로 부모 업데이트를 호출하는 것이라고 생각한다. – lweller

1

? 즉, 프로그램에 몇 개의 Model 객체가 있습니까? 어느 것이 관찰되고 있습니까? 어느 쪽이 관찰자들에게 통보하고 있습니까? 이것은 결과에 어떤 영향을 미칩니 까?

+0

현재 하나의 모델과 모델이 한 번만 호출됩니다. 하지만 나중에 모델을 다른 컨트롤러에 전달해야합니다 (위의 코드를 업데이트 할 예정입니다). 그러나 지금은 "Notify - Observable"과 "Notify - Observer"라는 출력이 있어야합니다. 테스트는 모델에 알립니다. –

+0

두 개의 모델 객체가없고 코드를 검색하면 새로운 모델이 두 번 호출된다는 것을 알 수 있습니다. 네가 이걸 알아 내려고 애 쓰고 있었지만, 그때 내가 뭘하려고했는지 알았지. –