Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Svverpdf
Svverpdf
http://www.parainformaticos.com
La opcin de Ingresos
La opcin de Ingresos consiste en registrar los datos considerando lo siguiente: a) El nmero de registro se genera automticamente en forma consecutiva empezando en 1 para el primer libro. b) El cdigo del libro debe tener 5 caracteres alfanumricos c) El ao de edicin puede ser a partir del ao 2000 hasta el ao 2050 d) No se permite el ingreso de cdigos duplicados. e) El estado del libro no se ingresa, pero debe considerarse como libre.
La opcin de Movimientos
La opcin de Movimientos consiste en seleccionar un libro previamente ingresado, mostrar sus datos, y elegir su nuevo estado: Libre, prstamo a Sala, prstamo a Domicilio. Slo si el nuevo estado fuera prstamo a domicilio se solicita fecha de devolucin; en otro caso la fecha de devolucin toma el valor 00/00/00. Para activar esta opcin slo se tiene que hacer clic en la ficha Movimientos como se aprecia a continuacin. Observe que al pasar el mouse sobre sta ficha aparece un texto con borde relacionado al contenido de la opcin.
27/08/2009
Pgina1
http://www.parainformaticos.com
La opcin de Disponibilidad
La opcin de Disponibilidad sirve para consultar los datos de un libro ya ingresado, eligindolo desde un comboBox.
La opcin de Listado
La opcin de Listado muestra todos los libros ingresados y almacenados en el arreglo de objetos, en forma de tabla. Para mostrar la informacin actualizada debe hacer clic en el botn de refrescar tabla.
27/08/2009
Pgina2
http://www.parainformaticos.com
Desarrollo
El cdigo esta compuesto de 9 clases: Libro, Libros, PanelIngresos, PanelMovimientos, PanelDisponibilidad, PanelTabla, PanelListado, PanelPrincipal y Principal. Todas las clases deben estar en el mismo proyecto.
Empecemos entonces creando un nuevo proyecto de nombre Problema03_09, nuevo paquete de nombre problema03. Clic derecho en el paquete creado, elegimos nuevo Java Class de nombre Libro donde escribimos el siguiente cdigo correspondiente a los atributos y a los constructores de la clase. public class Libro{ // datos privados de la clase private String Titulo, Autor, Codigo,Editorial, FechaDev;
// constructor que recibe un objeto Libro public Libro(Libro uno){ setTitulo(uno.getTitulo()); setAutor(uno.getAutor()); setCodigo(uno.getCodigo()); setEditorial(uno.getEditorial()); setFechaDev(uno.getFechaDev()); setDia(uno.getDia()); setMes(uno.getMes());
27/08/2009
Pgina3
http://www.parainformaticos.com
Tambin debe notar la presencia de dos constructores, uno sin parmetro y el otro con un parmetro que sirve para recibir un objeto de la misma clase y conservar los datos del parmetro recibido. En ste momento lo ms probable es que tenga marcado varias lneas con errores. Eso se debe a que falta generar los mtodos get/set para todos los atributos. Para generar los mtodos get/set haga clic derecho en la clase Libro, elija Refactor, Encapsulate Fields y marque los checks de todos los atributos como aprecia en la siguiente ventana:
Hace clic en el botn Refactor y listo. Ahora la clase completa queda as: public class Libro{ // datos privados de la clase private String Titulo, Autor, Codigo,Editorial, FechaDev;
27/08/2009
Pgina4
http://www.parainformaticos.com
setMes(uno.getMes()); setAnio(uno.getAnio()); setEstado(uno.getEstado()); setEdicion(uno.getEdicion()); }// fin del constructor // mtodos get/set generados por NetBeans public String getTitulo() { return Titulo; } public void setTitulo(String Titulo) { this.Titulo = Titulo; } public String getAutor() { return Autor; } public void setAutor(String Autor) { this.Autor = Autor; } public String getCodigo() { return Codigo; } public void setCodigo(String Codigo) { this.Codigo = Codigo; } public String getEditorial() { return Editorial; } public void setEditorial(String Editorial) {
27/08/2009
Pgina5
http://www.parainformaticos.com
public String getDia() { return dia; } public void setDia(String dia) { this.dia = dia; } public String getMes() { return mes; } public void setMes(String mes) { this.mes = mes; } public String getAnio() { return anio; } public void setAnio(String anio) { this.anio = anio; } public String getEstado() { return Estado; } public void setEstado(String Estado) { this.Estado = Estado; } public int getEdicion() { return Edicion;
27/08/2009
Pgina6
http://www.parainformaticos.com
import java.util.*;// para la clase ArrayList public class Libros { private ArrayList v; // constructor public Libros(){ v = new ArrayList(); } // metodos de administracin // agrega un nuevo Libro public void addLibro(Libro e){ v.add(e); } // obtiene un Libro de la posicion dada public Libro getLibro(int i){ return (Libro)v.get(i); } // reemplaza un Libro ya existente public void setLibro(int i, Libro e){ v.set(i,e); } // retorna el numero de Libros guardados en el ArrayList public int numeroLibros(){ return v.size(); } // busca un Libro por su codigo public int busca(String codigo){ for (int i=0; i<numeroLibros(); i++)
27/08/2009
Pgina7
return -1; //significa que no lo encuentra } // elimina un Libro public void elimina(int i){
http://www.parainformaticos.com
v.remove(i); } // elimina todos los objetos del ArrayList public void eliminaTodo(){ v.removeAll(v); } }// fin de la clase Libros
Vamos al cdigo fuente (source) del PanelIngresos para declarar los atributos y llenar los tems del comboBox en el constructor de la clase, as: public class PanelIngresos extends javax.swing.JPanel { // objeto de gestin de todos los libros static Libros libros = new Libros();
27/08/2009
Pgina8
http://www.parainformaticos.com
// llena los items del comboBox for (int i=2000; i <=2050; i++) cboEdicion.addItem(""+i);
El objeto de gestin de todos los libros tiene el modificador static porque ser utilizado desde varios paneles sin que pierda su informacin.
Regresamos al diseo y hacemos doble clic en el botn Aceptar para programar su accin: private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { aceptarIngresos(); } //----------------------------public void aceptarIngresos() { ingresarDatos(); if ( datosCorrectos() ) {
27/08/2009
Pgina9
http://www.parainformaticos.com
unLibro.setCodigo( leerCodigo() ); unLibro.setTitulo( leerTitulo() ); unLibro.setAutor( leerAutor() ); unLibro.setEditorial( leerEditorial() ); unLibro.setEdicion( Integer.parseInt(leerAnioDeEdicion()) ); unLibro.setEstado("Libre"); unLibro.setFechaDev("00/00/00"); } //............................. public String leerCodigo() { return txtCodigo.getText(); } //............................. public String leerTitulo() { return txtTitulo.getText(); } //............................. public String leerAutor() { return txtAutor.getText(); } //............................. public String leerEditorial() { return } //............................. public String leerAnioDeEdicion() { String AnioEdicion; txtEditorial.getText();
27/08/2009
Pgina10
http://www.parainformaticos.com
// verificar que tenga 5 caracteres if ( longitudCodi < 5 || longitudCodi > 5) mostarMensaje(longitudCodi); return false; } else return true; } //............................. public void mostarMensaje(int ContCodi) { JOptionPane.showMessageDialog(this,"El Cdigo tiene " + ContCodi + " cifras y debe tener 5 cifras" ); txtCodigo.requestFocus(); } //----------------------------public void almacenaDatos() { // guardar un libro en el vector libros.addLibro(unLibro); // datos correctos // datos incorrectos {
27/08/2009
Pgina11
http://www.parainformaticos.com
// mostrar datos ingresados de un libro imprime("Nmero de Registro :" + libros.numeroLibros()); imprime("Cdigo\t:" + unLibro.getCodigo()); imprime("Titulo\t:" + unLibro.getTitulo()); imprime("Autor\t:" + unLibro.getAutor()); imprime("Editorial\t:" + unLibro.getEditorial()); imprime("Ao de Edicin\t:" + unLibro.getEdicion());
//adicionar los cdigos ingresados a los combos respectivos //para su posterior consulta PanelMovimientos.getComboCodigos().addItem(unLibro.getCodigo()); PanelDisponibilidad.getComboCodigos().addItem(unLibro.getCodigo()); } //............................. public void borrarArea() { txtSalida.setText(""); } //............................. public void imprime(String cadena) { txtSalida.append(cadena + "\n"); } //-----------------------------
27/08/2009
Pgina12
http://www.parainformaticos.com
txtCodigo.requestFocus(); } No le sorprenda que hasta ac le aparescan 2 lneas de error que corresponden a la llamada de los paneles PanelMovimientos y PanelDisponibilidad porque stos paneles an no desarrollamos su diseo y cdigo. As que no se preocupe y sigamos desarrollando el proyecto. Regresamos al diseo y hacemos doble clic en el botn Cancelar para programar su accin: private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { prepararNuevoIngreso(); }
Algunas variables son de mbito static para que puedan ser utilizadas desde otros paneles sin perder su contenido. En el mtodo ingresarDatos() que se estn utilizando los mtodos de la clase propia para guardar los datos ledos, por ejemplo en la siguiente orden: unLibro.setEdicion( Integer.parseInt(leerAnioDeEdicion()) ); Se lee el ao de edicin del libro a travs del mtodo leerAnioDeEdicion(), el cual es retornado como String, se le convierte a entero cuyo valor es colocado en el dato del objeto unLibro a travs del mtodo setEdicion(). En el mtodo leerAnioDeEdicion() la siguiente orden: AnioEdicion = cboEdicion.getSelectedItem().toString(); Se obtiene el tem seleccionado como objeto cuyo valor se convierte en String a travs del mtodo toString(); siendo ste valor retornado para su uso. En el mtodo mostrarIngresos() que se muestran los datos ingresados utilizando los mtodos de la clase propia. Al hacer clic en el botn cancelar, no se guardan los datos ingresados y se prepara un nuevo ingreso.
PanelPrincipal con BorderLayout. En el centro colocamos un JTabbedPane que nos va permitir administrar un men de opciones tipo fichas. Vamos al cdigo fuente (source) del PanelPrincipal para escribir lo que est en negrita: public class PanelPrincipal extends javax.swing.JPanel { // declarar objetos de la GUI PanelIngresos panIng; PanelMovimientos panMovi; PanelDisponibilidad panDisp; PanelListado panList;
27/08/2009
Pgina13
http://www.parainformaticos.com
// establece texto que aparece al pasar el Mouse por cada // ficha jtpMenu.setToolTipTextAt(0,"Ingresa nuevo libro"); jtpMenu.setToolTipTextAt(1,"Cambia de estado:libre, sala, domicilio"); jtpMenu.setToolTipTextAt(2,"Muestra el estado actual del libro"); jtpMenu.setToolTipTextAt(3,"Muestra todos los libros"); // establece color de fondo para cada pestaa jtpMenu.setBackgroundAt(0,new Color(149,199,199)); jtpMenu.setBackgroundAt(1,new Color(199,199,149)); jtpMenu.setBackgroundAt(2,new Color(199,149,199)); jtpMenu.setBackgroundAt(3,new Color(249,249,199)); // establece un icono para cada pestaa jtpMenu.setIconAt(0, new ImageIcon(getClass().getResource("/images/bolita.gif"))); jtpMenu.setIconAt(1, new ImageIcon(getClass().getResource("/images/estrei.gif"))); jtpMenu.setIconAt(2, new ImageIcon(getClass().getResource("/images/estrei.gif"))); jtpMenu.setIconAt(3, new ImageIcon(getClass().getResource("/images/bolita.gif"))); } Si queremos que las fichas tenga alguna imagen, debemos crear la carpeta images dentro de la carpeta source (src) donde colocaremos las imgenes correspondientes. Para mayor detalle sobre la clase JTabbedPane puede revisar el captulo 3. Podemos decir que el uso de las clases propias no slo permiten construir paneles independientes sino tambin permiten definir objetos de dichas clases en cualquier panel. En un panel se pueden declarar variables globales que sean utilizadas exclusivamente en dicho panel; sin embargo cuando se tiene la necesidad de utilizar la misma variable sin perder su valor desde otros paneles; stas variables deben ser precedidas por la palabra reservada static y desarrollar su mtodo de retorno correspondiente. Tan simple como eso. Ahora creamos nuestro frame principal: clic derecho en el paquete problema03, elegimos nuevo JFrame Form de nombre Principal, le ponemos un ttulo y le aplicamos distribucin BorderLayout. Luego vamos al cdigo fuente y escribimos lo que est en negrita:
27/08/2009
Pgina14
Las opciones de men pueden tener diversas presentaciones; una de ellas es en forma de fichas como la que hemos presentado en ste ltimo ejercicio; otra es en forma de radioButtons; otra es en forma de botones; otra es en forma de men en un Frame cuando una opcin a su vez tiene otras opciones. Esta ltima forma la veremos en el ejercicio del prximo captulo.
http://www.parainformaticos.com
27/08/2009
Pgina15