의 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의 버튼을 클릭 했습니까?
나는 원어민이 아니기 때문에 그 사람의 이해를 바랍니다. 대신에 MainView
Observer
구현 및 Observer
같이 메인 뷰를 사용
안부
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
Java9의 Observable을 사용하고 있습니다. –
아, 죄송합니다. 나는 java.util.Observable 클래스에서 (이후 = "9") 보았고 자바 9에서 도입되었다고 생각했다. 실제로는 Java 9에서 시작하여 ** 비추천이다 **. – AJNeufeld