如何在 MVC 中更新和查看当前 window
How to update and view current window in MVC
我知道这里的很多帖子都提到了这个问题。
但是,我仍然不清楚,所以我想详细问你我的问题。
我必须使用 Swing 和 MVC 模型开发 java 应用程序。
申请主要分为两部分:
- 登录部分
- 问卷部分(登录后显示问卷)
所以按照 MVC 模型,我将我的代码分成 3 个包,其中包含以下 类:
Model
LoginModel
QuestionModel
View
LoginView
QuestionView
Controller
LoginController
QuestionController
开发这些 类 后,我不知道如何设置程序当前正在处理的 window(登录、问卷或其他未来实现)。
所以我考虑实施其他 3 个使用观察者模式的 类:
MainModel - Observable
MainView
MainController - Observer
但现在我不确定如何更改当前的 window。
例如,当登录成功时,window 必须从 LOGIN 变为 QUESTION,因此“MainModel.window = Window.QUESTION”并将其发送到视图。
是否应该通过使用 MainModel 扩展 LoginModel 将其添加到 LoginModel.login() 中?
或者我该怎么做?
我的代码:
public class main {
public static void main(String[] args) {
MainView view = new MainView();
MainModel model = new MainModel();
MainController controller = new MainController(view, model);
}
}
public class MainView {
private JFrame window;
public MainView() {
window = new JFrame();
window.setLayout(new CardLayout(0, 0));
LoginView login = new LoginView(); // init window at opening
QuestionView question = new QuestionView();
window.add(login);
window.add(question);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
public void update(Window window) {
// ??
}
}
public class MainModel {
private List<Observer> observers = new ArrayList<>();
private Window window;
public MainModel() {
window = Window.LOGIN; // init window at opening
}
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void setWindow(Window newWindow) {
newWindow = window;
for (Observer o : observers)
o.update(newWindow);
}
}
public class MainController implements Observer {
private MainView view;
private MainModel model;
public MainController(MainView view, MainModel model) {
this.view = view;
this.model = model;
this.model.addObserver(this);
}
@Override
public void update(Window window) {
this.view.update(window);
}
}
public class LoginView extends JPanel {
private JButton btnLogin;
// ... other attributes
public LoginView() {
btnLogin = new JButton("Login");
new LoginController(this);
}
public JButton getBtnLogin() {
return btnLogin;
}
public void ShowResult(boolean bResult) {
// print result with JOptionPane.showMessageDialog
}
}
public class LoginController {
private LoginView view;
public LoginController(LoginView view) {
this.view = view;
setActionListener();
}
public void setActionListener() {
ActionListener loginButton;
loginButton = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LoginModel model = new LoginModel();
boolean bResult = model.login(view.getUserNameField(), view.getPasswordField());
view.ShowResult(bResult);
}
};
view.getBtnLogin().addActionListener(loginButton);
}
}
public class LoginModel {
// ... attributes etc
public boolean login(String username, String password) {
boolean bResult;
// ... Some operation etc (useless for this example)
bResult = true; // Simulation login successful
if (bResult)
// ? Change window model to Window.QUESTION.
// But how?
// LoginModel extends MainModel? To call "super.setWindow(Window.QUESTION)?
return bResult;
}
}
// My Observer class
public interface Observer {
public void update(Window window);
}
// My Window class
public enum Window {
LOGIN,
QUESTION,
}
// Questionnaire classes code is very similar to the Login code
public class QuestionView extends JPanel {
private JButton btn;
// ...
new QuestionController(this);
// ...
}
public class QuestionController {
private QuestionView view;
// ...
setActionListener();
// ...
}
总之,使用这种方法是否正确?或者我还能如何 view/update 当前 window 更好?
在 Swing 中,MVC 模式如下所示:
- 视图从模型中读取
- 视图可能不会更新模型
- 控制器更新模型和视图
MVC 名称暗示您首先创建模型,然后是视图,然后是控制器。
通常没有一个控制器可以“一统天下”。每个侦听器负责自己的模型和视图部分。
您通常只有一种应用程序模型。一个应用程序模型由一个或多个普通的 Java getter/setter class 组成。在你的例子中,它看起来像一个人 class 和一个问卷 class。您可能还会有一个问题 class,用于保存一个问题、几个可能的答案以及所选的答案。你可能有额外的普通 Java getter/setter classes 我现在不考虑。
您将有一个 JFrame、一个用于保存问题和可能的答案的 JPanel,以及一个用于登录名和密码的 JDialog。对于不同类型的答案(不是不同的问题),您可能需要多个 JPanel,因此您可能需要一个带有 CardLayout 的主 JPanel。
您的控制器将是登录 JButton 的 ActionListener,以及“我已经回答完这个问题”的 JButton。您可能还有我现在没有考虑的其他听众。
我知道这里的很多帖子都提到了这个问题。
但是,我仍然不清楚,所以我想详细问你我的问题。
我必须使用 Swing 和 MVC 模型开发 java 应用程序。
申请主要分为两部分:
- 登录部分
- 问卷部分(登录后显示问卷)
所以按照 MVC 模型,我将我的代码分成 3 个包,其中包含以下 类:
Model
LoginModel
QuestionModel
View
LoginView
QuestionView
Controller
LoginController
QuestionController
开发这些 类 后,我不知道如何设置程序当前正在处理的 window(登录、问卷或其他未来实现)。
所以我考虑实施其他 3 个使用观察者模式的 类:
MainModel - Observable
MainView
MainController - Observer
但现在我不确定如何更改当前的 window。
例如,当登录成功时,window 必须从 LOGIN 变为 QUESTION,因此“MainModel.window = Window.QUESTION”并将其发送到视图。
是否应该通过使用 MainModel 扩展 LoginModel 将其添加到 LoginModel.login() 中?
或者我该怎么做?
我的代码:
public class main {
public static void main(String[] args) {
MainView view = new MainView();
MainModel model = new MainModel();
MainController controller = new MainController(view, model);
}
}
public class MainView {
private JFrame window;
public MainView() {
window = new JFrame();
window.setLayout(new CardLayout(0, 0));
LoginView login = new LoginView(); // init window at opening
QuestionView question = new QuestionView();
window.add(login);
window.add(question);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
public void update(Window window) {
// ??
}
}
public class MainModel {
private List<Observer> observers = new ArrayList<>();
private Window window;
public MainModel() {
window = Window.LOGIN; // init window at opening
}
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void setWindow(Window newWindow) {
newWindow = window;
for (Observer o : observers)
o.update(newWindow);
}
}
public class MainController implements Observer {
private MainView view;
private MainModel model;
public MainController(MainView view, MainModel model) {
this.view = view;
this.model = model;
this.model.addObserver(this);
}
@Override
public void update(Window window) {
this.view.update(window);
}
}
public class LoginView extends JPanel {
private JButton btnLogin;
// ... other attributes
public LoginView() {
btnLogin = new JButton("Login");
new LoginController(this);
}
public JButton getBtnLogin() {
return btnLogin;
}
public void ShowResult(boolean bResult) {
// print result with JOptionPane.showMessageDialog
}
}
public class LoginController {
private LoginView view;
public LoginController(LoginView view) {
this.view = view;
setActionListener();
}
public void setActionListener() {
ActionListener loginButton;
loginButton = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LoginModel model = new LoginModel();
boolean bResult = model.login(view.getUserNameField(), view.getPasswordField());
view.ShowResult(bResult);
}
};
view.getBtnLogin().addActionListener(loginButton);
}
}
public class LoginModel {
// ... attributes etc
public boolean login(String username, String password) {
boolean bResult;
// ... Some operation etc (useless for this example)
bResult = true; // Simulation login successful
if (bResult)
// ? Change window model to Window.QUESTION.
// But how?
// LoginModel extends MainModel? To call "super.setWindow(Window.QUESTION)?
return bResult;
}
}
// My Observer class
public interface Observer {
public void update(Window window);
}
// My Window class
public enum Window {
LOGIN,
QUESTION,
}
// Questionnaire classes code is very similar to the Login code
public class QuestionView extends JPanel {
private JButton btn;
// ...
new QuestionController(this);
// ...
}
public class QuestionController {
private QuestionView view;
// ...
setActionListener();
// ...
}
总之,使用这种方法是否正确?或者我还能如何 view/update 当前 window 更好?
在 Swing 中,MVC 模式如下所示:
- 视图从模型中读取
- 视图可能不会更新模型
- 控制器更新模型和视图
MVC 名称暗示您首先创建模型,然后是视图,然后是控制器。
通常没有一个控制器可以“一统天下”。每个侦听器负责自己的模型和视图部分。
您通常只有一种应用程序模型。一个应用程序模型由一个或多个普通的 Java getter/setter class 组成。在你的例子中,它看起来像一个人 class 和一个问卷 class。您可能还会有一个问题 class,用于保存一个问题、几个可能的答案以及所选的答案。你可能有额外的普通 Java getter/setter classes 我现在不考虑。
您将有一个 JFrame、一个用于保存问题和可能的答案的 JPanel,以及一个用于登录名和密码的 JDialog。对于不同类型的答案(不是不同的问题),您可能需要多个 JPanel,因此您可能需要一个带有 CardLayout 的主 JPanel。
您的控制器将是登录 JButton 的 ActionListener,以及“我已经回答完这个问题”的 JButton。您可能还有我现在没有考虑的其他听众。