我正在尝试学习MVC模式并在我的程序中实现它,该程序基本上是一个与DAO类进行对话的登录屏幕,它使用户可以通过数据库登录。现在,我有一个用于登录屏幕的视图类,以及一个具有访问UserDAO类的方法的控制器。每当按下登录按钮时,都应该使用控制器中的方法,但现在它会跳过该方法并运行它:panelView.programmainframe();,该方法会对该方法进行垃圾处理,直到我不得不强制退出程序为止。 这是我的看法:
package view;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import dao.UserDAO;
import db.DemoDB;
public class LoginView extends JFrame {
private static final long serialVersionUID = 1L;
Controller controller = new Controller();
JLabel l = new JLabel("Användarnamn:");
JLabel l1 = new JLabel("Lösenord:");
JTextField textfieldUsername = new JTextField(10);
JPasswordField textfieldPassword = new JPasswordField(10);
JButton loginButton = new JButton("Logga In");
PanelView gui = new PanelView();
public LoginView() throws IOException {
gui.mainFrame.setVisible(false);
loginButton.addActionListener(n -> {
try {
controller.loginListener();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
DemoDBSingleton = DemoDB.getInstance();
logInFrame();
}
public JFrame logInFrame() throws IOException {
this.setSize(800, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
JPanel p = new JPanel();
p.setBackground(new Color(224, 255, 255));
p.setLayout(null);
l.setFont(new Font("Tahoma", Font.PLAIN, 21));
l.setBounds(102, 173, 169, 41);
p.add(l);
textfieldUsername.setHorizontalAlignment(SwingConstants.CENTER);
textfieldUsername.setFont(new Font("Tahoma", Font.PLAIN, 16));
textfieldUsername.setBounds(303, 177, 169, 41);
p.add(textfieldUsername);
l1.setFont(new Font("Tahoma", Font.PLAIN, 21));
l1.setBounds(102, 290, 93, 26);
p.add(l1);
textfieldPassword.setHorizontalAlignment(SwingConstants.CENTER);
textfieldPassword.setFont(new Font("Tahoma", Font.PLAIN, 16));
textfieldPassword.setBounds(303, 287, 169, 41);
p.add(textfieldPassword);
loginButton.setBounds(334, 375, 110, 52);
p.add(loginButton);
this.getContentPane().add(p);
JCheckBox hidepasswordBox = new JCheckBox("Visa Lösenord");
hidepasswordBox.setBackground(new Color(224, 255, 255));
hidepasswordBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (hidepasswordBox.isSelected()) {
textfieldPassword.setEchoChar((char) 0);
} else {
textfieldPassword.setEchoChar('*');
}
}
});
hidepasswordBox.setBounds(303, 335, 110, 23);
p.add(hidepasswordBox);
return this;
}
public static void main(String[] args) throws IOException {
new LoginView();
}
}
这是我的控制器:
public class Controller {
private PanelView panelView;
private LoginView loginView;
DemoDB DemoDBSingleton = null;
UserDAO userDao = new UserDAO();
public Controller() throws IOException {
panelView = new PanelView();
loginView = new LoginView();
}
public void loginListener() throws IOException {
if (userDao.login(loginView.textfieldUsername.getText(),loginView.textfieldPassword.getText())) {
JOptionPane.showMessageDialog(null, "Välkommen " + loginView.textfieldUsername.getText() + "!");
panelView.programmainframe();
this.loginView.setVisible(false);
} else
JOptionPane.showMessageDialog(null, "Felaktigt användarnamn eller lösenord!!!");
}
}