2017-10-03 4 views
0

의 mvc 접근 방식에서 Observable calling update()를 확인하는 방법 mcv 방식으로 코드를 분리하는 법을 배우고 있습니다. 내 MainView 클래스에는 TextField와 Button으로 구성된 Object "InputPanelView"가 있습니다. 또한이 패널 앞에 붙이고 싶은 MainView에 Label이 있습니다. 버튼을 클릭하면 레이블이 TextField의 텍스트와 일치하도록 업데이트됩니다. 여기 자바 스윙

내 MAINVIEW입니다

public class MainView extends JFrame implements Observer{ 

/** 
* 
*/ 
private static final long serialVersionUID = -3923069538840783335L; 

private JLabel lbl; 

private InputPanelView view; 
private MainController mainController; 
private MainModel mainModel; 
public MainView() { 
    mainModel = new MainModel(); 
    lbl = new JLabel(); 
    mainController = new MainController(this, mainModel); 

    setSize(200, 70); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    JPanel panel = new JPanel(new BorderLayout()); 
    setContentPane(panel); 

    JPanel innerPanel = new JPanel(); 
    view = new InputPanelView(); 
    view.getModel().addObserver(this); 

    innerPanel.add(lbl); 
    innerPanel.add(view); 
    panel.add(innerPanel, BorderLayout.CENTER); 
} 

public JLabel getLbl() { 
    return lbl; 
} 

@Override 
public void update(Observable arg0, Object arg1) { 
    //Check which InputPanelView was clicked 
    } 
} 

내 InputPanelView :

public class InputPanelView extends JPanel { 

/** 
* 
*/ 
private static final long serialVersionUID = -3399831219930321653L; 
private TextField textField; 
private JButton inputButton; 
private InputPanelModel model; 
private InputPanelController controller; 

public InputPanelView() { 
    super(new GridBagLayout()); 
    model = new InputPanelModel(); 
    controller = new InputPanelController(this, model); 

} 

public TextField getTextField() { 
    return textField; 
} 

public JButton getInputButton() { 
    return inputButton; 
} 

public void createView() { 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.weightx = 1.0d; 
    textField = new TextField(); 
    add(textField, gbc); 
    gbc.gridx = 1; 
    gbc.fill = GridBagConstraints.NONE; 
    gbc.weightx = 0.0d; 
    inputButton = new JButton(); 

    add(inputButton, gbc); 

} 

public InputPanelModel getModel() { 
    return model; 

} 

그리고 내 InputPanelController :

public class InputPanelController implements ActionListener { 
private InputPanelModel model; 
private InputPanelView view; 

public InputPanelController(InputPanelView inputPanelView, InputPanelModel model) { 
    this.model = model; 
    this.view = inputPanelView; 
    this.view.createView(); 
    this.view.getInputButton().setText(this.model.getBtnText()); 
    this.view.getInputButton().addActionListener(this); 
    this.view.getTextField().setText(this.model.getTxtText()); 

} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == view.getInputButton()) { 
     model.setTxtText(view.getTextField().getText()); 

    } 
} 

public InputPanelView getView() { 
    return view; 
} 
의도 한대로 작동

하지만 난과 MAINVIEW 또 다른 InputPanelView를 추가하는 경우 다른 Label, update() 메소드에서 Label을 각각 어떻게 변경해야합니까? 어떤 InputPanelView의 버튼을 클릭 했습니까?

나는 원어민이 아니기 때문에 그 사람의 이해를 바랍니다. 대신에 MainViewObserver 구현 및 Observer 같이 메인 뷰를 사용

안부

+1

Java 9의 ['java.util.Observable'] (http://download.java.net/java/jdk9/docs/api/java/util/Observable.html) 또는 JavaFX의 [javafx .beans.Observable'] (http://download.java.net/java/jdk9/docs/api/javafx/beans/Observable.html). 또는 당신 자신의 관례'Observable'? (JavaFX와 Swing을 함께 사용하는 것은 좋지 않습니다.) – AJNeufeld

+0

Java9의 Observable을 사용하고 있습니다. –

+0

아, 죄송합니다. 나는 java.util.Observable 클래스에서 (이후 = "9") 보았고 자바 9에서 도입되었다고 생각했다. 실제로는 Java 9에서 시작하여 ** 비추천이다 **. – AJNeufeld

답변

0

...

view.getModel().addObserver(this); 

는 ... 사용 이상의 Observer :

view.getModel().addObserver(new Observer() { 
    @Override 
    void update(Observable arg0, Object arg1) { 
     updateView1(arg0, arg1); 
    } 
}); 

view2.getModel().addObserver(new Observer() { 
    @Override 
    void update(Observable arg0, Object arg1) { 
     updateView2(arg0, arg1); 
    } 
}); 

그런 다음 MainViewObserver을 구현할 필요가 없습니다.