martes, 9 de junio de 2015

Desarrollo de una interfaz gráfica en java: limitar el número de caracteres en un campo.

Nos vemos en la necesidad de limitar el numero de caracteres que podemos introducir en un campo cualquiera, por ejemplo, un JTextField.   Para ello realizaremos lo siguiente:





Solo tenemos que generar un evento KeyListener para el componente que deseemos, y añadir el código que limita la entrada de caracteres, diciéndole que si la longitud de los caracteres es, por ejemplo, igual o superior a 30, ignore todos los caracteres sobrantes.


Este es el código que añadimos:

 private void jTextFieldNombreKeyTyped(java.awt.event.KeyEvent evt) {                                          
        if (jTextFieldNombre.getText().length()>= 30){
            evt.consume();
        }


Desarrollo de una interfaz gráfica en java: código para limpiar los componentes.

Requerimos que nuestra aplicación limpie diversos componentes al pulsar el botón "Limpiar".

Para ello creamos un método "ActionPerformed" para limpiar desde el botón:

/**
     * jButtonLimpiarActionPerformed.
     * Realiza las operaciones necesarias para limpiar los datos introducidos
     * si pulsamos en el botón limpiar.
     * 
     * @param evt 
     */
    private void jButtonLimpiarActionPerformed(java.awt.event.ActionEvent evt) {                                               
        //Primero vamos a limpiar todos los jTextField.
        jTextFieldNifNie.setText("");
        jTextFieldTelefono.setText("");
        jTextFieldNombre.setText("");
        jTextFieldApellidos.setText("");
        jTextFieldAsistentesPrevistos.setText("10");
        jTextFieldCodigoPostal.setText("");
        jTextFieldDireccion.setText("");
        jTextFieldNumeroHabitaciones.setText("");
        jTextFieldPoblacion.setText("");
        //Limpiamos el SpinnerFecha: no se si existirá otro método menos engorroso 
        //para limpiar un jSpinner.
        jSpinnerFecha.setModel(new javax.swing.SpinnerDateModel(new java.util.Date(), null, null,                      java.util.Calendar.MONTH));
        //Limpiamos el jListTipoCocina.
        jListTipoCocina.setModel(new javax.swing.AbstractListModel() {
            String[] strings = {"Buffé", "Buffé vegetariano", "Carta", "Cita con el Chef", "No precisa"};

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });
        //Limpiamos los radioButtons.  Este sí que es un método sencillo para limpiar.
        buttonGroup1.clearSelection();
        //Limpiamos el jSpìnnerJornadasCongreso.
        jSpinnerJornadasCongreso.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(1),                       Integer.valueOf(1), null, Integer.valueOf(1)));
        //Limpiamos el jCheckBoxRequiereHabitaciones. Como se me permite añadirlo
        //a un buttonGroup, lo he hecho para poder aplicar el método clearSelection.
        buttonGroup2.clearSelection();
        //Limpiamos el ComboBox Tipo de habitación.
        jComboBoxTipoHabitacion.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Individual",                "Doble", "Doble dos camas", "Junior Suite"}));
        //Ahora inhabilitamos los campos que deben de estar inhabilitadas de inicio,
        // que son los del panel congreso.
        jSpinnerJornadasCongreso.setEnabled(false);
        jCheckBoxRequiereHabitaciones.setEnabled(false);
        jTextFieldNumeroHabitaciones.setEnabled(false);
        jComboBoxTipoHabitacion.setEnabled(false);
        
    }       

      



domingo, 7 de junio de 2015

Desarrollar una interfaz gráfica en java, activar y desactivar un componente desde un radiobutton.

Queremos activar o desactivar un componente desde al pulsar un radiobutton en concreto. Para ello tenemos varios radiobuttons y solo uno activa el componente.



En la imagen podemos ver que el radiobutton "Congreso" activa el componente "Jornadas del Congreso". Cualquiera de los otros dos radiobuttons no los activará.



Así, en la clase que desarrolla la interfaz gráfica, desarrollamos los siguientes métodos:


/**
     * jRadioButtonBanqueteActionPerformed.
     * Nos aseguramos que al pulsar el Radio Button Banquete, el panel referido
     * a Congreso, permanece inhabilitado.
     * 
     * @param evt 
     */
    private void jRadioButtonBanqueteActionPerformed(java.awt.event.ActionEvent evt) {                                                     

        if (jRadioButtonBanquete.isSelected()) {
            jSpinnerJornadasCongreso.setEnabled(false);
            jCheckBoxRequiereHabitaciones.setEnabled(false);
            jTextFieldNumeroHabitaciones.setEnabled(false);
            jComboBoxTipoHabitacion.setEnabled(false);
        }

    }                                                    

    private void jTextFieldAsistentesPrevistosActionPerformed(java.awt.event.ActionEvent evt) {                                                              


    }                                                             
/**
 * jRadioButtonJornadaActionPerformed.
 * Nos aseguramos que al pulsar el Radio Button Jornada, el panel referido a
 * congreso, permanece inhabilitado.
 * 
 * @param evt 
 */
    private void jRadioButtonJornadaActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        if (jRadioButtonJornada.isSelected()) {
            jSpinnerJornadasCongreso.setEnabled(false);
            jCheckBoxRequiereHabitaciones.setEnabled(false);
            jTextFieldNumeroHabitaciones.setEnabled(false);
            jComboBoxTipoHabitacion.setEnabled(false);
        }
    }                                                   

    /**
     * jRadioButtonCongresoActionPerformed.
     * Nos aseguramos que al pulsar el Radio Button Congreso, el panel referido
     * a  Congreso se habilita.
     * 
     * @param evt 
     */
    private void jRadioButtonCongresoActionPerformed(java.awt.event.ActionEvent evt) {                                                     
        if (jRadioButtonCongreso.isSelected()) {
            jSpinnerJornadasCongreso.setEnabled(true);
            jCheckBoxRequiereHabitaciones.setEnabled(true);

        }

    }                               



Desarrollar una interfaz gráfica en java: validar que la fecha introducida es superior a la fecha del sistema.

En el desarrollo de nuestra interfaz debemos introducir un campo para reservar una fecha para la celebración de un evento.  Cuando el usuario de la aplicación está realizando la reserva, evidentemente no podrá reservar para una fecha inferior o igual a la actual, que siempre será la fecha del sistema sobre el que trabaje nuestra aplicación.


/**
     * validarFechaEvento. Comprueba que la fecha introducida es mayor que la
     * fecha del sistema
     *
     * @return true si <code>el campo 'Fecha Hora'</code> es mayor que la fecha
     * del sistema, y false en caso que sea igual o menor.
     */
    protected static boolean validarFechaEvento() {

        try {
            SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yy HH:mm");
            Date fechaDate1 = ((Date) VentanaEvento.jSpinnerFecha.getValue());
            Date fechaDate2 = new Date();
            String fechaEvento = formateador.format(fechaDate1);
            String fechaSistema = formateador.format(fechaDate2);
            if (fechaDate1.before(fechaDate2)
                    || (fechaDate1.equals(fechaDate2))) {//Si fecha del evento es menor o igual que fecha evento.
                boolFechaCorrecta = false;
            } else {
                if (fechaDate2.before(fechaDate1)) {
                    boolFechaCorrecta = true;
                } else {
                }
            }
        } catch (Error e) {

            System.out.println("Se Produjo un Error!!!  " + e.getMessage());
        }
        return boolFechaCorrecta;
    }



Ahora solo tenemos que "enlazar" el método a la clase que desarrolla nuestra interfaz gráfica:

//Si el código postal es correcto, pasamos a comprobar la fecha del evento.
                else if (Validar.validarFechaEvento() == false) {
                    JOptionPane.showMessageDialog(null, "La fecha del evento debe de ser mayor"
                            + "que la fecha actual.", "ERROR: Fecha/Hora incorrecta.", JOptionPane.ERROR_MESSAGE);
                    boolDatosCorrectos = false;
                }


Ahora, si introducimos una fecha inferior o igual a la fecha del sistema, la aplicación nos lanzará un mensaje de error.

Desarrollo de una interfaz gráfica en java: validar que no existan campos vacíos.

En la interfaz gráfica que estamos desarrollando queremos desarrollar un método para que compruebe si existen campos vacíos.  En caso de que exista alguno, la aplicación debe de lanzar un mensaje de error.



En la clase Validar.java creamos el método:

/**
     * camposVacios. Comprueba que ninguno de los campos referentes a los datos
     * personales en la ventana Eventos, estén vacíos.
     *
     * @return true si ninguno de los campos referentes a los <code>datos
     * personales</code> está vacío y false en caso contrario.
     */
    protected static boolean camposVacios() {

        if (VentanaEvento.jTextFieldNifNie.getText().isEmpty()
                || VentanaEvento.jTextFieldTelefono.getText().isEmpty()
                || VentanaEvento.jTextFieldNombre.getText().isEmpty()
                || VentanaEvento.jTextFieldApellidos.getText().isEmpty()
                || VentanaEvento.jTextFieldPoblacion.getText().isEmpty()
                || VentanaEvento.jTextFieldDireccion.getText().isEmpty()
                || VentanaEvento.jTextFieldCodigoPostal.getText().isEmpty()) {

            boolDatosPersonales = false;

        } else {
            boolDatosPersonales = true;
        }
        return boolDatosPersonales;
    }



Ahora "enlazamos" el método camposVacios con la clase en la que desarrollamos la interfaz gráfica.

//Validamos que no haya vacío ningún campo referente a los datos personales.
                if (Validar.camposVacios() == false) {
                    JOptionPane.showMessageDialog(null, "No se puede dejar vacío ningún dato personal", "ERROR.                         Campo vacío.", JOptionPane.ERROR_MESSAGE);
                    boolDatosCorrectos = false;
                }


Si dejamos un campo vacío, la aplicación nos lanzará un mensaje de error.

Desarrollo de una interfaz gráfica en java : validar la longitud de un campo.

Vamos a validar la longitud de un campo mediante un método de validación.  Esta es la interfaz donde aparece el campo que queremos validar.


En una clase que podemos llamar por ejemplo " Validar.java"  añadimos el método para validar el campo nombre.  Vamos a crear el método de validación:

 
/**
     * longitudNombre. Valida que el campo del nombre, en la venanta Evento,
     * tenga un máximo de 30 carácteres.
     *
     * @return si el <code>campo nombre</code> tiene más de 30 carácteres
     * devuelve false y true en caso contrario.
     */
    protected static boolean longitudNombre() {
        if (VentanaEvento.jTextFieldNombre.getText().length() > 30) {
            boolLongitudNombre = false;
        } else {
            boolLongitudNombre = true;
        }
        return boolLongitudNombre;
    }


Ahora "enlazamos" el método longitudNombre con la clase en la que desarrollamos la interfaz gráfica.

//Si el teléfono es correcto comprobamos que la longitud del campo nombre no super los 30 carácteres.
                else if (Validar.longitudNombre() == false) {
                    JOptionPane.showMessageDialog(null, "La longitud del campo 'Nombre' debe de ser como\n"
                            + "máximo de 30 carácteres.", "ERROR: longitud de campo incorrecta", JOptionPane.ERROR_MESSAGE);
                    boolDatosCorrectos = false;
                }




Si introducimos más de 30 caracteres en el campo nombre, la aplicación nos lazará un mensaje de error con los detalles del mismo.

jueves, 4 de junio de 2015

Java Swing, modificar el modelo de un spinner

Podemos cambiar el modelo de los spinners que por defecto nos da Netbeans. Las opciones que tenemos son :

  • predeterminado,
  • fecha, 
  • lista,
  • número.

En este vídeo se muestra el proceso.



Java swing, ejemplo sobre paneles.

Aquí tenemos un ejemplo de los distintos tipos de paneles que podemos añadir a un contenedor principal o JFrame.   Este ejemplo ha sido realizado con Netbeans como IDE y Ubuntu como sistema operativo.


lunes, 1 de junio de 2015

Java Swing, comparando el código de una ventana modal y una no modal.

Para la ventana modal.

import javax.swing.JDialog;
import javax.swing.JFrame;
public class VentanaModal {
    public static void main(String[] args){
        JFrame ventanaModal = new JFrame("¡ Intenta Cerrar esta ventana !.");
        ventanaModal.setAlwaysOnTop(true);
        ventanaModal.setSize(300,300);
        ventanaModal.setVisible(true);
        JDialog dialogoModal= new JDialog(ventanaModal,"DIALOGO MODAL", true);
        dialogoModal.setSize(300,300);
        dialogoModal.setLocationRelativeTo(null);
        dialogoModal.setVisible(true);
             
    }  
}

Para la ventana no modal.

import javax.swing.JDialog;
import javax.swing.JFrame;


public class VentanaNoModal {
    public static void main(String[] args){
        JFrame ventanaNoModal = new JFrame("¡ Intenta Cerrar esta ventana !");
        ventanaNoModal.setAlwaysOnTop(true);
        ventanaNoModal.setSize(400,400);
        ventanaNoModal.setVisible(true);
        JDialog dialogoNoModal = new JDialog(ventanaNoModal, "DIALOGO NO MODAL", false);
        dialogoNoModal.setSize(300,300);
        dialogoNoModal.setLocationRelativeTo(null);
        dialogoNoModal.setVisible(true);
    }  

}






Java Swing, evento para un botón que cierra la ventana actual.

private void BotonCerrarVentanActionPerformed(java.awt.event.ActionEvent evt) {                                                
        dispose();
        this.setVisible(false);
    }                                              


Java Swing, evento para un botón que abre una ventana.



private void BotonAbrirVentanaActionPerformed(java.awt.event.ActionEvent evt) {                                                
        new VentanaQueSeAbre(this, true).setVisible(true);
    }        


sábado, 23 de mayo de 2015

La importancia de las pruebas de software

Nuestro entorno social está íntimamente relacionado con la tecnología hasta el más mínimo detalle. Más allá de los nuevos dispositivos de hardware que constantemente invaden el mercado, hay una especie de alma que controlan y determina el devenir de esos dispositivos y de nuestra propia existencia, nuestro bienestar y seguridad : el software.

No vamos a entrar en detalles de que es el software, ni de cómo se realizan las pruebas de software; esos, son cuestiones tan extensas que necesitaríamos dos o tres temas de ingeniería informática para explicarlos.  Hablemos llanamente de la importancia de las pruebas de software.

Los objetivos de las pruebas de software.




En la anterior presentación podemos ver cuáles son los principales objetivos de las pruebas de software, pero más allá de los objetivos teóricos, veamos algunos ejemplos de la vida real, en algunos casos ejemplos de consecuencias trágicas, como el ocurrido hace poco en nuestro país.






Si quieres, con una rápida búsqueda en Internet puedes encontrar  otros fallos de software que causaron graves problemas.  Aquí te dejo un enlace.

Evidentemente, todos los ejemplos de fallos en el software , no son achacables a que no se realicen las necesarias pruebas en el desarrollo del mismo y, es que, ni siquiera llevando a cabo las más estrictas pruebas y planificaciones de software, se puede garantizar que esté libre de fallos.  Tratándose de software, el conjunto completo de casos de prueba es teóricamente infinito y por lo tanto, el número de pruebas a realizar implicará la búsqueda de un equilibrio entre recursos y tiempo. 

Tanto el desarrollador de software, como el cliente que encarga el desarrollo, se han de exigir que se realice una estricta planificación de las estrategias de prueba.  Según diversos estudios el coste económico relativo a un error se multiplica por un factor de 1 si se comete en la fase de análisis de requisitos, por 3-6 si es en la fase de diseño, por 10 si es en la codificación y por 40-50 si es en la fase de pruebas.

Finalmente  debemos de tener claro que "el cliente siempre lleva la razón" y, por esta razón, después de un cierto tiempo en el que el cliente haya estando usando nuestra aplicación y descubra defectos, o que la aplicación no realice lo que se esperaba de ella o en la forma en que se esperaba, debemos revisar la aplicación y corregir esas taras.