Java 如何将视图(GUI)链接到相应的控制器

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.

我正在用java创建一个应用程序,遵循MVC模式。 我的程序由多个必须连接在一起的界面屏幕组成。此外,应用程序使用Derby数据库。 我的问题是无法将视图(包含GUI)链接到相应的控制器。 让我更准确地说明文件中包含的内容

在包视图中,有几个文件包含生成“屏幕”的所有代码。例如,我有一个文件Login.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 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非常感谢。我读了你建议的页面,但看起来有点复杂,有没有更简单的方法?