我知道這里的許多帖子都涵蓋了這個問題。但是,我還是有一點不清楚,所以我想詳細問你我的問題。
我必須使用 Swing 和 MVC 模型開發一個 java 應用程式。
應用主要分為兩部分:
- 登錄部分
- 問卷部分(登錄后顯示問卷)
因此,遵循 MVC 模型,我將代碼分為 3 個包含以下類的包:
Model
LoginModel
QuestionModel
View
LoginView
QuestionView
Controller
LoginController
QuestionController
開發這些類后,我不知道如何設定程式當前正在處理的視窗(登錄、問卷或其他未來實作)。
所以我考慮實作其他 3 個使用觀察者模式的類:
MainModel - Observable
MainView
MainController - Observer
但現在我不確定如何更改當前視窗。
比如登錄成功后,視窗必須從LOGIN變成QUESTION,所以“MainModel.window = Window.QUESTION”發送給View。
是否應該通過使用 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();
// ...
}
那么總而言之,使用這種方法是否正確?或者我還能如何更好地查看/更新當前視窗?
uj5u.com熱心網友回復:
在 Swing 中,MVC 模式如下所示:
- 視圖從模型中讀取
- 視圖可能不會更新模型
- 控制器更新模型和視圖
MVC 名稱意味著您首先創建模型,然后是視圖,然后是控制器。
通常沒有一個控制器來“統治所有”。每個偵聽器負責它自己的模型和視圖部分。
您通常只有一種應用程式模型。應用程式模型由一個或多個普通 Java getter/setter 類組成。在您的情況下,它看起來像一個 Person 類和一個 Questionaire 類。您可能還會有一個 Question 類,用于保存一個問題、幾個可能的答案和選擇的答案。您可能還有其他我現在沒有考慮的普通 Java getter/setter 類。
您將擁有一個 JFrame、一個用于保存問題和可能的答案的 JPanel,以及一個用于登錄名和密碼的 JDialog。對于不同型別的答案(不是不同的問題),您可能需要多個 JPanel,因此您可能需要一個帶有 CardLayout 的主 JPanel。
您的控制器將是登錄 JButton 的 ActionListener,以及“我已經回答完這個問題”JButton。您可能還有其他我現在沒有考慮的聽眾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/331481.html
