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

时间:2014-05-26 18:31:22

标签: java swing user-interface model-view-controller

我正在按照MVC模式在java中创建一个应用程序。 我的程序由更多必须连接在一起的界面屏幕组成。此外,该应用程序使用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);
  }

}

包Controller中的文件包含用于执行用户输入的数据检查的方法。然后从数据库中执行查询。 例如,文件 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;
   }

}

文件 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 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;
   }   

}

Model包包含表示对象的文件。例如,文件 Studente.java 代表"学生"并且包含执行查询的方法(插入,选择等)。

我想要实现的是,在应用程序启动时,创建了第一个图形登录屏幕。控制器控制用户插入的数据并将它们与数据库中的数据进行比较,如果数据正确,则程序打开一个新页面(例如,A.java)。 相反,用户点击注册按钮,然后应用程序打开注册页面等...

我不知道该怎么做..

我想到的唯一想法是在视图文件中创建控制器的实例并传递数据但是却无法将这个想法付诸实践。 无论如何,这个想法看起来并不是很干净"。

其他提示?

非常感谢,抱歉我的英语不好!

0 个答案:

没有答案