Java 如何将视图(GUI)链接到相应的控制器
我正在用java创建一个应用程序,遵循MVC模式。 我的程序由多个必须连接在一起的界面屏幕组成。此外,应用程序使用Derby数据库。 我的问题是无法将视图(包含GUI)链接到相应的控制器。 让我更准确地说明文件中包含的内容 在包视图中,有几个文件包含生成“屏幕”的所有代码。例如,我有一个文件Login.java,如下所示:Java 如何将视图(GUI)链接到相应的控制器,java,swing,user-interface,model-view-controller,Java,Swing,User Interface,Model View Controller,我正在用java创建一个应用程序,遵循MVC模式。 我的程序由多个必须连接在一起的界面屏幕组成。此外,应用程序使用Derby数据库。 我的问题是无法将视图(包含GUI)链接到相应的控制器。 让我更准确地说明文件中包含的内容 在包视图中,有几个文件包含生成“屏幕”的所有代码。例如,我有一个文件Login.java,如下所示: package View; import Model.*; import Controller.*; import java.awt.*; import java.awt.
package View;
import Model.*;
import Controller.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
import java.util.*;
public class Login {
LoginController loginC;
RegController regC;
public JButton accediButton;
public JButton regButton;
public JTextField textUsername;
public JPasswordField textPassword;
public JLabel labelUsername;
public JLabel labelPassword;
public JLabel labelTitolo;
public JLabel oppureLabel;
public JFrame loginFrame = new JFrame("Login");
public JPanel panel = new JPanel();
public Login() {
panel.setLayout(null);
setupGUI();
loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void setupGUI() {
regButton = new JButton();
regButton.setLocation(68,206);
regButton.setSize(80,30);
regButton.setText("Registrati");
panel.add(regButton);
//...other similar code...
Registrazione regView = new Registrazione();
loginC = new LoginController(this);
regC = new RegController(regView);
accediButton.addActionListener(loginC);
//regButton.addActionListener(regC);
}
}
文件Registrazione.java非常相似,如下所示
package View;
import Model.*;
import Controller.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
import java.util.*;
public class Registrazione {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JPanel titlePanel = new JPanel();
JPanel centerPanel = new JPanel();
JPanel labelPanel = new JPanel();
JPanel inputPanel = new JPanel();
JPanel buttonPanel = new JPanel();
GridBagConstraints c;
JButton bindietro = new JButton("Indietro");
JButton bok = new JButton("Ok");
public JTextField username;
public JPasswordField password;
public JTextField nome;
public JTextField cognome;
public Registrazione() {
frame.setTitle("Registrazione");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.setVisible(true);
panel.setLayout(new BorderLayout());
centerPanel.setLayout(new GridBagLayout());
panel.add(titlePanel, BorderLayout.NORTH);
panel.add(buttonPanel, BorderLayout.SOUTH);
panel.add(centerPanel, BorderLayout.CENTER);
buttonPanel.add(bindietro);
buttonPanel.add(bok);
//code...
frame.pack();
centerWindow(frame);
//listener
login();
indietro();
}
public void login() {
bok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
//code...
}
});
}
public void indietro() {
bindietro.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
Login log = new Login();
frame.dispose(); //chiude il frame corrente (Registrazione)
}
});
}
public static void centerWindow(Window frame) {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, y);
}
}
软件包控制器中的文件包含对用户输入的数据执行检查的方法。然后从数据库执行查询。
例如,文件LoginController如下所示:
package Controller;
import Model.*;
import Model.Studente;
import View.Login.*;
import View.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class LoginController implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
String insertedUsername = loginView.textUsername.getText();
String insertedPassword = loginView.textPassword.getText();
System.out.println(insertedUsername + insertedPassword);
if(insertedUsername.equals("") || insertedPassword.equals(""))
System.out.println("Stringhe vuote.");
boolean res = checkData(insertedUsername, insertedPassword);
if(res) {
loginView.loginFrame.dispose();
System.out.println("Dati corretti.");
}
else {
JOptionPane.showMessageDialog(null, "Username o password errati.", "Login error", JOptionPane.ERROR_MESSAGE);
loginView.textUsername.setText(insertedUsername);
loginView.textPassword.setText(insertedPassword);
loginView.textUsername.requestFocus();
}
}
catch(SQLException ex) {
System.err.println("Controller/LoginController - " + ex + ".");
}
}
public boolean checkData(String user, String pass) throws SQLException {
studente = studente.findByUsername(user);
boolean bool = false;
if(studente != null) {
if(studente.password.equals(pass)) {
bool = true;
}
}
return bool;
}
}
package Controller;
import Model.*;
import Model.Studente;
import View.Login.*;
import View.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class RegController implements ActionListener {
public RegController() {
}
public void actionPerformed(ActionEvent e) {
try {
String insertedUsername = regView.username.getText();
String insertedPassword = regView.password.getText();
String insertedNome = regView.nome.getText();
String insertedCognome = regView.cognome.getText();
System.out.println(insertedUsername + insertedPassword + insertedNome + insertedCognome);
if(insertedUsername.equals("") || insertedPassword.equals("") || insertedNome.equals("") || insertedCognome.equals(""))
System.out.println("Stringhe vuote.");
boolean res = checkData(insertedUsername);
if(res) {
studente.setId("1");
studente.setUsername(insertedUsername);
studente.setPassword(insertedPassword);
studente.setNome(insertedNome);
studente.setCognome(insertedCognome);
studente.save();
}
else {
JOptionPane.showMessageDialog(null, "Username già usato, riprova.", "Registrazione error", JOptionPane.ERROR_MESSAGE);
regView.username.setText(insertedUsername);
regView.password.setText(insertedPassword);
regView.nome.setText(insertedNome);
regView.cognome.setText(insertedCognome);
regView.username.requestFocus();
}
}
catch(SQLException ex) {
System.err.println("Controller/LoginController - " + ex + ".");
}
}
public boolean checkData(String user) throws SQLException {
boolean bool = true;
studente = studente.findByUsername(user);
if(studente != null) {
bool = false;
}
return bool;
}
}
文件RegController如下所示:
package Controller;
import Model.*;
import Model.Studente;
import View.Login.*;
import View.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class LoginController implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
String insertedUsername = loginView.textUsername.getText();
String insertedPassword = loginView.textPassword.getText();
System.out.println(insertedUsername + insertedPassword);
if(insertedUsername.equals("") || insertedPassword.equals(""))
System.out.println("Stringhe vuote.");
boolean res = checkData(insertedUsername, insertedPassword);
if(res) {
loginView.loginFrame.dispose();
System.out.println("Dati corretti.");
}
else {
JOptionPane.showMessageDialog(null, "Username o password errati.", "Login error", JOptionPane.ERROR_MESSAGE);
loginView.textUsername.setText(insertedUsername);
loginView.textPassword.setText(insertedPassword);
loginView.textUsername.requestFocus();
}
}
catch(SQLException ex) {
System.err.println("Controller/LoginController - " + ex + ".");
}
}
public boolean checkData(String user, String pass) throws SQLException {
studente = studente.findByUsername(user);
boolean bool = false;
if(studente != null) {
if(studente.password.equals(pass)) {
bool = true;
}
}
return bool;
}
}
package Controller;
import Model.*;
import Model.Studente;
import View.Login.*;
import View.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class RegController implements ActionListener {
public RegController() {
}
public void actionPerformed(ActionEvent e) {
try {
String insertedUsername = regView.username.getText();
String insertedPassword = regView.password.getText();
String insertedNome = regView.nome.getText();
String insertedCognome = regView.cognome.getText();
System.out.println(insertedUsername + insertedPassword + insertedNome + insertedCognome);
if(insertedUsername.equals("") || insertedPassword.equals("") || insertedNome.equals("") || insertedCognome.equals(""))
System.out.println("Stringhe vuote.");
boolean res = checkData(insertedUsername);
if(res) {
studente.setId("1");
studente.setUsername(insertedUsername);
studente.setPassword(insertedPassword);
studente.setNome(insertedNome);
studente.setCognome(insertedCognome);
studente.save();
}
else {
JOptionPane.showMessageDialog(null, "Username già usato, riprova.", "Registrazione error", JOptionPane.ERROR_MESSAGE);
regView.username.setText(insertedUsername);
regView.password.setText(insertedPassword);
regView.nome.setText(insertedNome);
regView.cognome.setText(insertedCognome);
regView.username.requestFocus();
}
}
catch(SQLException ex) {
System.err.println("Controller/LoginController - " + ex + ".");
}
}
public boolean checkData(String user) throws SQLException {
boolean bool = true;
studente = studente.findByUsername(user);
if(studente != null) {
bool = false;
}
return bool;
}
}
模型包包含表示对象的文件。例如,有一个文件Studente.java,它表示“student”,并包含执行查询(insert、select等)的方法
我想要实现的是,在应用程序启动时,创建了第一个图形登录屏幕。控制器控制用户插入的数据并将其与数据库中的数据进行比较,如果数据正确,则程序将打开一个新页面(例如,a.java)。
相反,用户点击注册按钮,然后应用程序打开注册页面,等等
我不知道怎么做
我提出的唯一想法是在视图文件中创建控制器的实例并传递数据,但一直未能将此想法付诸实践。。
无论如何,这个想法似乎不是很“干净”
其他提示
非常感谢你,很抱歉我的英语不好 请查收。希望它能帮助你设计更多effectively@PramodPP非常感谢。我读了你建议的页面,但看起来有点复杂,有没有更简单的方法?