domingo, 14 de diciembre de 2014

Ejemplo: JavaSE, aplicación MVC - IV

Hola Jabatos:

Hoy nos toca trabajar con las vistas.

Bueno, el planteamiento es el siguiente: vamos a construir una clase por cada componente de mostrar datos. Las clases implementarán los métodos necesarios para crear los componentes y modificarlos en su caso. Además deberán implementar el ActionListener necesario para manejar los eventos de pulsación de botones.

La estructura es: un JFrame principal. Existirán dos componentes que funcionan por separado y se excluyen. Un JPanel que alojarán las pantallas de identificación y la de creación (ambas son JPanels). El otro componente será un JTabbedPane que incluye dos pestañas que alojan las pantallas de Datos Personales y Profesionales (ambas también JPanel).


Esto nos da un total de 7 elementos, de los cuales 6 tendrán contenidos y por lo tanto tendremos que construir 6 clases. Empecemos con la clase que implementa el JPanel de creación:

public class PanelCreacion implements ActionListener {

// paneles auxiliares
private JPanel r0;
private JPanel r1;
private JPanel r2;
private JPanel r3;
private JPanel r4;
private JPanel r5;
private JPanel r6;
private JPanel r7;

// componentes del formulario
private JTextField nameField;
private JTextField userField;
private JPasswordField passField;
private JTextField emailField;
private JComboBox<String> sectorField;
private JTextField profField;
private JTextField oldField;

// backgrounds del formulario
private final Color BACKGR0=Color.WHITE;
private final Color BACKGR1=Color.RED;

public PanelCreacion() {

}

public JPanel makePanelCreacion() {

JPanel panel=new JPanel();
panel.setLayout(new GridLayout(8,1));

// los componentes van colocados en  paneles auxiliares
r0=new JPanel();
r1=new JPanel();
r2=new JPanel();
r3=new JPanel();
r4=new JPanel();
r5=new JPanel();
r6=new JPanel();
r7=new JPanel();

// creamos los componentes del panel 0
r0.setLayout(new GridLayout(1,2));
JLabel name=new JLabel(" Nombre");
name.setFont(new Font("Arial",Font.BOLD,18));
nameField=new JTextField("");
nameField.setBackground(BACKGR0);
nameField.setToolTipText("Entre 3 y 20 caracteres");
// añadimos al panel con labels de margenes
r0.add(name);
r0.add(nameField);

// creamos los componentes del panel 1
r1.setLayout(new GridLayout(1,2));
JLabel login=new JLabel(" Usuario");
login.setFont(new Font("Arial",Font.BOLD,18));
userField=new JTextField("");
userField.setBackground(BACKGR0);
userField.setToolTipText("Entre 6 y 20 caracteres");
// añadimos al panel con labels de margenes
r1.add(login);
r1.add(userField);

// creamos los componentes del panel 2
r2.setLayout(new GridLayout(1,2));
JLabel pass=new JLabel(" Contraseña");
pass.setFont(new Font("Arial",Font.BOLD,18));
passField=new JPasswordField("");
passField.setBackground(BACKGR0);
passField.setToolTipText("Entre 6 y 20 caracteres");
// añadimos al panel con labels de margenes
r2.add(pass);
r2.add(passField);

// creamos los componentes del panel 3
r3.setLayout(new GridLayout(1,2));
JLabel email=new JLabel(" Email");
email.setFont(new Font("Arial",Font.BOLD,18));
emailField=new JTextField("");
emailField.setBackground(BACKGR0);
emailField.setToolTipText("Entre 6 y 30 caracteres");
// añadimos al panel con labels de margenes
r3.add(email);
r3.add(emailField);

// creamos los componentes del panel 4
r4.setLayout(new GridLayout(1,2));
JLabel sector=new JLabel(" Sector");
sector.setFont(new Font("Arial",Font.BOLD,18));
sectorField=new JComboBox<String>();
sectorField.addItem("Industria");
sectorField.addItem("Comercio");
sectorField.addItem("Agricultura");
sectorField.addItem("Servicios");
sectorField.addItem("Otros");
// añadimos al panel con labels de margenes
r4.add(sector);
r4.add(sectorField);

// creamos los componentes del panel 5
r5.setLayout(new GridLayout(1,2));
JLabel prof=new JLabel(" Profesión");
prof.setFont(new Font("Arial",Font.BOLD,18));
profField=new JTextField("");
profField.setBackground(BACKGR0);
profField.setToolTipText("Entre 6 y 20 caracteres");
// añadimos al panel con labels de margenes
r5.add(prof);
r5.add(profField);

// creamos los componentes del panel 6
r6.setLayout(new GridLayout(1,2));
JLabel old=new JLabel(" Antiguedad");
old.setFont(new Font("Arial",Font.BOLD,18));
oldField=new JTextField("");
oldField.setBackground(BACKGR0);
oldField.setToolTipText("4 caracteres (AÑO)");
// añadimos al panel con labels de margenes
r6.add(old);
r6.add(oldField);

// creamos los componentes del panel 7
JButton button1=new JButton("Grabar");
button1.setToolTipText("Pulse para grabar el usuario");
JButton button2=new JButton("Borrar");
button2.setToolTipText("Pulse para borrar el formulario");
JButton button3=new JButton("Volver");
button3.setToolTipText("Pulse para volver a identificación");
// añadimos al panel
r7.add(button1);
r7.add(button2);
r7.add(button3);

// activamos los listeners de los botones
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);

// finalmente, componemos el JPanel para return
// añadiendo los paneles auxiliares y JLabels para separacion
panel.add(r0);
panel.add(r1);
panel.add(r2);
panel.add(r3);
panel.add(r4);
panel.add(r5);
panel.add(r6);
panel.add(r7);

panel.setBorder(BorderFactory.createRaisedBevelBorder());
panel.setVisible(true);
return panel;
}

/**
* Este método realiza una simple comprobación de los datos del formulario
* @return boolean
*/
private boolean checkForm() {

// inicializamos por comprobacion de formulario
boolean result=true;
nameField.setBackground(BACKGR0);
userField.setBackground(BACKGR0);
passField.setBackground(BACKGR0);
emailField.setBackground(BACKGR0);
profField.setBackground(BACKGR0);
oldField.setBackground(BACKGR0);

if (nameField.getText().trim().length()<3 || nameField.getText().trim().length()>20) {
nameField.setBackground(BACKGR1);
result=false;
}
if (userField.getText().trim().length()<6 || userField.getText().trim().length()>20) {
userField.setBackground(BACKGR1);
result=false;
}
char[] pss=passField.getPassword();
if (pss.length<6 || pss.length>20) {
passField.setBackground(BACKGR1);
result=false;
}
if (emailField.getText().trim().length()<6 || emailField.getText().trim().length()>30) {
emailField.setBackground(BACKGR1);
result=false;
}
if (profField.getText().trim().length()<6 || profField.getText().trim().length()>20) {
profField.setBackground(BACKGR1);
result=false;
}
if (oldField.getText().trim().length()!=4) {
oldField.setBackground(BACKGR1);
result=false;
} else {
try {
// si no es parseable es que no es un numero
@SuppressWarnings("unused")
int n=Integer.parseInt(oldField.getText().trim());
} catch (NumberFormatException nf) {
oldField.setBackground(BACKGR1);
result=false;
}
}
return result;
}

@Override
public void actionPerformed(ActionEvent arg0) {

String source=arg0.getActionCommand();

if (source.equals("Grabar")) {
// Graba usuario en la aplicacion
if (checkForm()) {
UsuariosDAO userDAO=new UsuariosDAO();
Usuarios usuario=new Usuarios();
usuario.setNombre(nameField.getText().trim());
usuario.setLogin(userField.getText().trim());
usuario.setPassword(String.valueOf(passField.getPassword()));
usuario.setEmail(emailField.getText().trim());
usuario.setSector(String.valueOf(sectorField.getSelectedItem()));
usuario.setProfesion(profField.getText().trim());
usuario.setAntiguedad(Integer.parseInt(oldField.getText().trim()));
if (userDAO.createUser(usuario)) {
JOptionPane.showMessageDialog(null, "Usuario grabado correctamente", "Grabación de usuarios", JOptionPane.INFORMATION_MESSAGE);
// volvemos a la pantalla de identificacion
// FALTA IMPLEMENTAR METODO DE CAMBIO PANTALLA
} else {
JOptionPane.showMessageDialog(null, "Error grabando el usuario", "Grabación de usuarios", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null, "Error en los datos del formulario", "Grabación de usuarios", JOptionPane.ERROR_MESSAGE);
}
}

if (source.equals("Borrar")) {
// borramos los datos introducidos
nameField.setText("");
userField.setText("");
passField.setText("");
emailField.setText("");
sectorField.setSelectedIndex(0);
profField.setText("");
oldField.setText("");
}

if (source.equals("Volver")) {
// volvemos a la pantalla de identificacion
       // FALTA IMPLEMENTAR METODO DE CAMBIO PANTALLA
}
}

} // ***** END OF CLASS

Una vez que esté funcionando, este panel (que es lo que está en el recuadro en relieve, el resto es el JFrame) quedará más o menos así:



La clase tiene 3 métodos: el makePanelCreacion() que crea el panel; el checkForm() empleado para chequear el formulario; y el ActionPerformed() implementado para el control de los eventos de pulsación de los botones.

Detalles:
  • El panel consiste en una agregación de paneles; estos paneles agrupan componentes. Está táctica es un tanto compleja pero eficaz para lograr un buen ajuste.
  • En checkForm() se utiliza la propiedad backGround de los JTextField para remarcar los errores. Siempre que tenemos formularios hay que tener un checkform que verifique, antes de la grabación, si los campos del formulario se adaptan a los requisitos.
  • En "grabar" el procedimiento consiste en que primero chequeamos el formulario. Si todo está correcto, creamos un objeto Usuarios y lo grabamos con el método createUser del DAO. Mostramos mensajes de OK o problemas mediante JOptionPane.
  • No hemos creado aún los métodos de volver al formulario de identificación. Serán desarrollados más adelante. De momento, dejamos advertencia en el lugar correspondiente

Continua...

Anterior tema                                                                                         Siguiente tema

No hay comentarios:

Publicar un comentario