lunes, 31 de octubre de 2011

Interfaz Gráfica (Taller)

A continuación se muestra la ventana inicial con la que cualquier usuario del software tendrá que interactuar. A simple vista se nota la presencia de una barra de menús y dos menús, uno llamado “Archivo” y el otro “Edición”.



En esta segunda vista se observan las opciones del menú Archivo, las cuales son Abrir, Guardar como… y Salir. También se pueden apreciar las teclas aceleradoras para cada uno de los MenuItems.




Y por último y de igual manera que en la segunda, en la tercera se visualizan  las opciones del menú Edición, junto con sus respectivos shortcuts.






Quizás ésta no sea la interfaz final ya que pienso agregar algunas cosas más.

jueves, 20 de octubre de 2011

Interfaz Gráfica (Clase)

Enseguida muestro la interfaz que desde un inicio me planteé hacer para mi proyecto.
Interfaz gráfica inicial
View more presentations from Jair Viezca

Como se puede apreciar en la filmina #2, la interfaz consiste básicamente en una gran área de trabajo, una barra de menús con sus respectivos menús (Archivo, Edición, Formato, Ayuda) y una barra de herramientas con su grupo de iconos que representan funcionalidades del sistema (Nuevo, Copiar, Cortar, Negrita, Cursiva). En la parte inferior de la pantalla pienso colocar una barra de estado en el que se indiqué en que documento se está.


El contenido de los menús también lo puse para dejar más o menos en claro que es lo que deseo poner en cada uno de ellos.


Por si existe algún problema para ver el slideshare, dejaré las imágenes correspondientes a la interfaz. Además subiré el dibujo con el que empecé a planear mi interfaz.










En la siguiente filmina se puede observar a detalle cada una de las opciones que pienso colocar en cada uno de los menús. 

Eventos, excepciones y errores (Taller)

El proyecto que estoy llevando a cabo consiste actualmente en cinco clases: Interfaz, ModeloAbrir, ControladorAbrir, ModeloGuardar, ControladorGuardar; algunas de las cuales cuentan con eventos (especialmente los controladores) y con excepciones.



Eventos

ControladorAbrir

Esto es lo que pasa cuando presiono el botón Abrir del menú Archivo






public void actionPerformed(ActionEvent event)
    {
     // Se crea el FileChooser.
        fc = new JFileChooser();
        
      
        int respuesta;

      
        respuesta = fc.showOpenDialog(areaDeTrabajo);
        

        //  Confirma que se haya presionado el botón Abrir y así poder aplicar
        // la lógica de la opción Abrir
        if (JFileChooser.APPROVE_OPTION == respuesta)
        {
         
         // Se obtiene el fichero
         File archivo = fc.getSelectedFile();
         
            try
            {
             
                
             //  Se abre el archivo. Este método tiene que ser definido por las
             // clases hijas
                logicaAbrir(archivo);
            }
            catch (Exception e)
            {
             // Mensaje de error si se produce.
                JOptionPane.showMessageDialog(
                    areaDeTrabajo, e, "Error en el archivo " + archivo,
                    JOptionPane.ERROR_MESSAGE);
            }
        }
    }
 


ControladorGuardar

Esto es lo que pasa cuando presiono el botón Guardar del menú Archivo





public void actionPerformed(ActionEvent event)
    {   
        
        selectorArchivos = new JFileChooser();
        int respuesta;

        respuesta = selectorArchivos.showSaveDialog(areaDeTrabajo);
        

        //  Confirma que se haya presionado el botón Guardar y así poder aplicar
        // la lógica de la opción Guardar
        if (JFileChooser.APPROVE_OPTION == respuesta)
        {
         // Se obtiene el fichero
            File archivo = selectorArchivos.getSelectedFile();

            try
            {
             // Se guarda. Las clases hijas deben redefinir este método.
                logicaGuardar(archivo);
            }
            catch (Exception e)
            {
             // Mensaje de error si se produce.
             JOptionPane.showMessageDialog(null,"Error de archivo"+e.toString());
            }
        }
    }
 




Copiar, cortar y pegar del menú Edición

Para estas opciones no fue necesario implementar la interfaz ActionListener y su respectivo método abstracto public void actionPerformed(ActionListener arg0) debido a que ya puedo encontrar las acciones en la biblioteca de Java, más en específico de DefaultEditorKit el cual se puede encontrar en la librería javax.swing.text. Para hacer lo anterior (y como se puede apreciar en el código) primero debemos obtener el mapa de acciones del área de Texto para poder agregar las acciones (copiar, cortar y pegar) a los MenuItems y llevarlas a cabo dentro de dicha área. Lo que habría que checar es si es posible realizar dichas acciones en otros componentes de Texto (JEditorPane, JTextPane).


Action accionCopiar = areaDeTexto.getActionMap().get(DefaultEditorKit.copyAction);
accionCopiar.putValue(Action.NAME,"Copiar  ");
accionCopiar.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('C',Event.CTRL_MASK));
copiar = new JMenuItem(accionCopiar);

Action accionPegar = areaDeTexto.getActionMap().get(DefaultEditorKit.pasteAction);
accionPegar.putValue(Action.NAME,"Pegar  ");
accionPegar.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('P',Event.CTRL_MASK));
pegar = new JMenuItem(accionPegar);


Action accionCortar = areaDeTexto.getActionMap().get(DefaultEditorKit.cutAction);
accionCortar.putValue(Action.NAME,"Cortar  ");
accionCortar.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('O',Event.CTRL_MASK));
cortar = new JMenuItem(accionCortar);
 


Excepciones y errores

ModeloAbrir

Se presentan dos excepciones en esta parte del código.

1.- Se arroja la excepción FileNotFoundException cuando no se puede encontrar el archivo.

2.- En el try-catch, el catch y IOException se emplean cuando existe un error de lectura.



protected void logicaAbrir(File archivo)
         throws FileNotFoundException
     {
      // Se crea el objeto archivoEntrada para leer el archivo.
      // bufferLinea irá modificando su longitud al ir leyendo las lineas del
      // archivo. Al final todos esos caracteres se colocarán en el area de Texto
         BufferedReader archivoEntrada = new BufferedReader(new FileReader(archivo));
         StringBuffer bufferLinea = new StringBuffer();

         try
         {
             String linea = archivoEntrada.readLine();

             while (linea != null)
             {
              //  Se va añadiendo las líneas que se leen a la variable bufferLinea
              //  modificando cada vez la longitud de caracteres de esta variable.
              // Además se agrega un salto de línea con la instrucción 
              // System.getProperty("line.separator") la cual da mayor portabilidad
                 bufferLinea.append(linea);
                 bufferLinea.append(System.getProperty("line.separator"));
                 
                 // Siguiente linea.
                 linea = archivoEntrada.readLine();
             }
         }
         catch (IOException e)
         {
             JOptionPane.showMessageDialog(
                 areaDeTrabajo, e, "Error al leer el archivo",
                 JOptionPane.ERROR_MESSAGE);
   
         }

         // Se pone el texto leido en el JTextArea.
         areaDeTrabajo.setText(bufferLinea.toString());
     }
 }
 


ControladorAbrir

Excepción para cuando existan errores al abrir el archivo

// Se crea el FileChooser.
        fc = new JFileChooser();
        
      
        int respuesta;

      
        respuesta = fc.showOpenDialog(areaDeTrabajo);
        

        //  Confirma que se haya presionado el botón Abrir y así poder aplicar
        // la lógica de la opción Abrir
        if (JFileChooser.APPROVE_OPTION == respuesta)
        {
         
         // Se obtiene el fichero
         File archivo = fc.getSelectedFile();
         
            try
            {
             
             
             //  Se abre el archivo. Este método tiene que ser definido por las
             // clases hijas
                logicaAbrir(archivo);
            }
            catch (Exception e)
            {
             // Mensaje de error si se produce.
                JOptionPane.showMessageDialog(
                    areaDeTrabajo, e, "Error en el archivo " + archivo,
                    JOptionPane.ERROR_MESSAGE);
            }
        }
 


ModeloGuardar

Excepción utilizada para saber avisar que se ha producido errores al momento de guardar.



selectorArchivos = new JFileChooser();
        int respuesta;

        respuesta = selectorArchivos.showSaveDialog(areaDeTrabajo);
        

        //  Confirma que se haya presionado el botón Guardar y así poder aplicar
        // la lógica de la opción Guardar
        if (JFileChooser.APPROVE_OPTION == respuesta)
        {
         // Se obtiene el fichero
            File archivo = selectorArchivos.getSelectedFile();

            try
            {
             // Se guarda. Las clases hijas deben redefinir este método.
                logicaGuardar(archivo);
            }
            catch (Exception e)
            {
             // Mensaje de error si se produce.
             JOptionPane.showMessageDialog(null,"Error de archivo"+e.toString());
            }
        }
 


Fuentes
Chuidiang

Eventos, excepciones y errores (Clase)

Eventos


Excepciones y Errores

En la siguiente entrada se podrán ver códigos en donde manejo estos eventos, excepciones y errores. Cabe mencionar que estos eventos, excepciones y errores son los más importantes.

Diagramas de secuencia para mi proyecto

Para realizar los diagramas de secuencia que se presentarán a continuación hice uso de un recurso web localizado en la página http://www.websequencediagrams.com/.

Los diagramas de secuencia los hice en base a dos casos de uso: el de abrir y guardar archivo. En cada uno de ellos simule una situación exitosa y una fallida.

Caso de uso: Abrir Archivo





Caso de uso: Guardar Archivo




Diagramas de secuencia


Hay una gran variedad de diagramas que se pueden hacer para nuestros proyectos de POO, como lo son los de Casos de Uso, los de Clases, los de Objetos, etc. Ahora toca el turno de “hablar” acerca de los Diagramas de Secuencia, que forman parte de cualquier trabajo bien hecho.

Como ya se vio en entradas pasadas, un recurso de modelación  que se podría usar para hacer este tipo de diagramas es el Umbrello, el cual es una herramienta CASE que no sólo nos permite hacer estos diagramas sino otros más.
Los diagramas de secuencia muestran la forma como se comunican los objetos entre sí al ejecutarse un programa o un caso de uso de éste. Ésta representación se hace por medio de un conjunto de símbolos, algunos de los cuales son:



Ejemplos




Diagramas de secuencia actividad
View more presentations from Jair Viezca

Fuentes
1
2
3
4

jueves, 29 de septiembre de 2011

Tarjetas CRC

  • Son una metodología para el diseño de programas orientados a objetos.
  • CRC son las iniciales de clase, responsabilidad y colaboración.
  • Resumen las responsabilidades de una clase antes de pasar a realizar el diagrama.
  • Sirven para simular escenarios.

Las tarjetas CRC representan objetos; la clase a la que pertenece el objeto se puede escribir arriba, las responsabilidades u objetivos que debe llevar a cabo el objeto se pueden escribir a la izquierda, y la derecha las clases que se relacionan con dicho objeto.



Tarjetas CRC de mi Proyecto