Professional Documents
Culture Documents
"1) Opt ionPane..showMessagetiox( ‘aul, 1); = Listarlos divisores de un determinado niimero entero. ‘nto - 18; ant i - 15 while (io) © 4f (9 % 4 ~~ 8) JOptionPane, showessageBox( ‘null, 4); 7.4.3 Estructura de repet La estructura do... while ejecuta un ntimero determinado de veces un conjunto de sentencias 0 instrucciones y controla el ntimero de iteraciones que esta realiza mediante una condicién légica. La condicién siempre se evalia al final de la estructura, Su formato se basa en la siguiente estructura: nt _i-1; <—— Valor inicial ce OptionPane. showilessageDialog("mull", 4); } white: 4<718) ; Contador Cuerpo del ciclo do... while Figura 7.6 Estructura de la sentencia do... while. Donde: = Valor inicial. Aqui se define el valor de inicio que tendré el ciclo de repeticiones con do.... while. Hay que tener en cuenta que dicho valor se evalda al final de la estructura while; y mientras sea verdadera la condicién, el ciclo seguiraCapitulo 7: Estructura de repeticién ["a8 = Limite, Define el valor final del ciclo de repeticiones. Los operadores que se pueden usar son >)5 = Contador. indica la forma del ciclo de repeticiones. Asi pues, cuando se dan ciclos de forma ascendente, se usa el operador ++; mientras que, en el caso de ciclos descendentes, el operador = Cuerpo del ciclo do while. Aqui se definen las sentencias o instrucciones que se repetirin segiin el limite impuesto al ciclo de repeticiones. De forma gréfica, la estructura do... while se muestra de la siguiente manera: | Instrucciones repetidas Verdad Instruccién posterior Figura 7.7 Diagrama de la estructura do while. A continuacién, se presenta una lista de situaciones para el ciclo do while: = Listarlos 10 primeros nmeros usando la estructura do while. int i-1; do { JOpt-ionPane. shouessageBox( ‘null, 1); } white (i<19); = Listar los 10 primeros numeros en forma descendente usando la estructura do while. ‘nt i-19; do ‘JOptionPane. showMessageBox( taut ', 1); ) white (>-1) 5 = Listarlos divisores de un determinado niimero entero. int 9 - 19; int 1-1; do { 4f (n % 4 -= 8) JOptionPane, showtessageBox( ‘mult, 4) 5 3 white lin);Manuel Torres Remon 7.5 Variables y métodos de clase: modificador static En Java, los atributos que contiene el modificador static en su implementacién son conocidos como atributos de clase. Uno de los posibles usos del modificador static es para compartir el valor de una variable miembro entre objetos de una misma clase. Algunas caracteristicas del modificador static son las siguientes: = Sus atributos son compartidos por todas las instancias de la clase. = Permite definir clases que pueden ser llamadas desde otras clases sin usar objetos. = Permite compartir un valor de una variable miembro entre objetos de una misma clase. La referencia por medio de this a las variables estaticas genera un error, puesto que la variable estatica no puede ser accedida por ningun objeto. 7.5.1 Variable de clase Es una variable que se crea una sola vez para todos los objetos de la misma clase. Formato: visibiLidad statfe tipoDatos nonbreatr ibuto - valorinicial; lad. Puede ser asignada como piiblica o privada; si es declarada como privada, necesi- tard un método get que permitiré devolver el valor. i= Static. Modificador que asigna una variable de clase, = tipoDatos. Es el tipo de datos de la variable de clase, = nombreAtributo. Es el nombre asignado a la variable de clase. = valorinicial. Si el tipo de datos es numérico, se le asignaré el valor cero; en caso de ser una cadena, se le asignard comillas dobles. | Ejemplo. Se necesita contabilizar las veces que se crea el objeto Empleado en una aplicacién. La solucién se da en tres pasos: = Primero, se debe implementar la clase Empleado, public class Fnpleadot private String codigo; private String nombres; private int eded; private static int contacor-a;25 Capitulo 7: Estructura de repeticién = Segundo, se debe implementar el método constructor. public Enpleado(String codigo,String norbres Amt edad) { ‘this.codigo - codigo; ‘this.nonbres - nombres; this. edad - edad; contador++; = Tercero, se debe implementar un método que devolverd el valor que obtiene la variable de clase contador. public int gercontador(){ return contador; y = Para obtener el valor de Ia variable de clase, se coloca el siguiente script: Enpleado objémp ~ new Empleado(); Opt ionPane.showMessageDialog(mull, ‘El total de Empleados es: * + ‘objEnp. getContadar ()) ; 7.5.2 Métodos estaticos Los métodos static permiten optimizar la memoria en tiempo de ejecucién porno tener que crear instancias para acceder a métodos comunes de los objetos. Formato para la implementacidn de un método estatico: Visibilidad statie tipoDatos nonbrettetodo() { return valor; } Donde: = Visibilidad. Es el alcance (publico, privado o protegido) que tiene el método esté- tico implementado. = static. Define el método de clase. = tipoDatos. Es el valor devuelto por el método de clase; hay que tener en cuenta que el valor devuelto a través del return sea del mismo tipo implementado. = nombreMetodo. Es el nombre asignado al método de clase. = return valor. Es el valor devuelto por el método. Formato para la invocacién de un método estatico: Variable ~ NombreClase..Nombr ele tadoEs ico); Para la invocacién del método de clase no seré necesario importar el paquete, ya que el método serd llamado directamente desde la clase.= | Manuel Torres Remon | Ejemplo. Se necesita contabilizar las veces que se crea el objeto Empleado en una aplicacién, Veamos el script = Primero, se debe implementar la clase Empleado. public class Enploadot private String codigo; private String nondres; private int edad; private static int contador-9; = Segundo, se debe implementar el método constructor. public Fnpleado (String codigo, String nondres Ame edad) { ‘this..codigo - codigo; this.nonbres ~ nonbres; this.edad ~ edad; contador m= Tercero, se debe implementar un método de clase que devolveré el valor que obtiene la variable de clase contador. public static int getContador (){ return contador; } = Para invocar al método, se coloca el siguiente script: JOptionPane.showMessageDialog(null, "El total de Enpleados es: + Empleado.getContador()) ; 7.5.3 Inicializadores de variables de clase Los atributos static son inicializados una sola vez dentro de la clase en forma automatica. Formato para la inicializacién de variables de clase: static { var iableClase-valorInicial; } Donde: m= variableClase. Es el atributo declarado como estatico, = valorinicial. Es el valor inicial del atributo estatico.Capitulo 7: Estructura de repeticin Fy CASO DESARROLLADO 1: Control de registro de participantes (usando contadores) Implemente una aplicacién que permita controlar los asistentes a una fiesta; para ello debera ingresar la edad, sexo (masculino y femenino) y estado civil (soltero, casado, viudo y divorciado) del asistente. Luego muestre las siguientes estadisticas: Total de asistentes . Total de personas mayores de edad . Total de personas menores de edad . Total de hombres . Total de mujeres . Total de solteros Consideraciones: Total de casados Total de viudos Total de divorciados Porcentaje de hombres Porcentaje de mujeres = Desarrolle la aplicacién usando la metodologia orientada a objetos con los métodos get y set, el método constructor y los atributos estaticos para los conteos. Use el siguiente disefio de interfaz grdfica: En un cuadro de texto, debe ingresar la edad del participante. El tipo de sexo debe ser seleccionado a partir del control JCheckbox. El estado civil debe ser seleccionado a partir del control JRadioButton. Cree una clase llamada Participants que defina los atributos referentes a los datos del parti- cipante, ademas de definir los atributos estaticos. Muestre el resultado de la aplicacién en un control JList.Manuel Torres Remon Soluci6n: 1. Seleccione la ruta File > New > Java Project. 2. Asigne el siguiente nombre al proyecto: pjAplicacion71. 3, Agregue los paquetes pFormularios y pClases. 4, Agregue un JFrame dentro del paquete pFormularios y asignele el nombre frmParticipantes. 5, Agregue una clase llamada Participantes en el paquete pClases. 6, Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: btoLimplar tsi a btnProcesar chatasculing DOTS rCasado reviudo rdivorciado tstResumen igura 7.8 Controles del formulario de control de personas. Resumen de controles: 1 dlabel REGISTRO DE PARTICIPANTES 2 STextField twtEdad 3 Scheckbox chkMasculino 4 JRadiobutton rbSoltero, 5 JRadiobutton rbCasado 6 JRadiobutton rbViudo 7 JRadiobutton rbDivorciado 8 JButtongroup bgestado 9 Button binProcesar 10 sutton bintimpiar 11 JButton btnSalir 12 dist \stResumentulo 7: Estructura de repeticion [735 7. Enla clase Participantes coloque el siguiente cédigo: package pClases; public class Participantes { private int edad; private String masculine; private string estadocivil; private static int total-0; private static int tHonbro~ private static int cHujercs~9; private static int tHayores-9; private static int tHecores-; private static int tSolteros-9; private static int cCasados-9; private static int cViudos-o; private static int toivorciados-0; public Participantes() { totality 3 public int getéded() { return eda } public void setEdad(imt edad) { ‘this.edad - edad; } public String gettiasculino() { return masculino; y public void setiasculino(String masculine) { ‘this.masculino ~ masculino; 3 public String getestadocivil() { return estadocivil; } public void setEstadocivil (String estadoCivit) ¢ this estadoCivil - estadeCivil; } public static int gotTotal() { return total; } public static int getthonbre() { return tHonbre; y public static int getttujeres() { return ‘ujeres; } public static int gettliayores() { return tlayores; }Manuel Torres Remon public static int gertiienores() { return ‘lenores; 3 public static int getrsolteros() { return ©Solteros; 3 public static int gettcasados() { return {Casados; } public static int gertViudes() { return (Viudos; 3 public static int getwDivorciados() { return (Divore ados; 3 public void determinaSexa() 4f (masculino.equals( ‘Masculino")) Hombres else ‘tHujeres++; 3 public void determinatdad()¢ 4f (edad>-18) tHayorest+ else ‘tHenores++; } public void determinatstado() { if (estadoCivil.equals( "Soltero")) ‘tSolteros++; else if (estadoCivil.equals( 'Casado")) ‘tCasados++; else if (estadoCivil.equals( ‘Viudo")) ‘tViudos++s else ‘Divorciados++; El cédigo del formulario frmParticipantes se muestra como sigue: package pFormularios; Amport javax.swing.DefaultListModel; ‘import javax. swing. JOptionPane; ‘import pClases.Participantes; public class frnParticipantes extends javax.swing.JFrane { DefaultListMadel moR ~ new DefaultListtodel(); public frnParticipantes() { nitComponents() 5 3pitulo 7: Estructura de repeticién | private void btnProcesarActionPer formed(java.aut .event.ActionEvent evt) { $f (vatsea() equals(*")) Participantes objP ~ new Participentes(); objP . setEdad (Integer .parseInt (txtEdad. getText())) 5 4f (chkascul ino. isSelected()) { ‘obj. setMasculino( Mascul ina") ; } else { objP. setMasculino( *Fenenino'); ¥ 4f (rbsoltero.isselected()) { ‘objP. setéstadoCivil( *soltera " } else 4F (roCasado. isSelected()) { objP. setEstadaCivil( *Casado"); } else 4F (rbViudo. isSelected()) { objP. setEstadoCivil( "Viudo"); | else { objP. setEstadoCivil( *Divorciado ‘0b}P..determinaédad() ; ‘objP.determinaSexo() ; ‘0bjP.determinatstado() ; Ant total - objp.getTotal(); Ant totalMayor ~ objP. gettMayores() nt totalMenor ~ objP.gettMenores() ; int totalHonbres - objP.gettHonbre() ; int totalMujeres - objP.gettMujeres(); Ant totalsolteros - objP.gettSolteros(); Aint totalCasados ~ objP.gettCasados() ; Ant totalviudos ~ obj?.gettViudos() ; Ant totalDivorciados ~ obj?.gettDivorciades() ; ‘int porcentajeHionbres ~ (totalHonbres * 108) / total; nt porcentajeMujeres ~ (totalMujeres * 196) / total; oR. clear(); mmoR -addElement('** ESTADESTICAS ***); oR -addElement( ‘El Total de Asistentes es: * + total); nmoR addELenent(*El Total. de Personas mayores es: ' + totalMayor); nmoR-addElenent( ‘EL Total de Personas menores es: * + totalMenor) smoR add Lenent ( #— mmoR-addElenent (‘EL Total de Honbres es: * + ‘totalHonbres); ‘moR-addElenent (‘El Total de Mujeres es: ' + totalMujeres); smoR -addELenent ( #9, nnoR-addELenent ‘El Total de Solteros es: ' + totalsolteros) ; ‘moR addElenent (El Total de Casadas es: ' + totalCasados); mmoR addElement('El Total de Viudos es: ' + totalv/iudos); ‘moR add lenent (‘El Total de Divorciados es: * + totalDivorciados) ; ‘moR add Lenent (#9; ‘oR, addElenent(% de Horbres es: * + (totalHonbres * 198) / total); ‘oR: addFlenent( % de Mujeres es: + (totalMujeres * 109) / total); ‘UstResunen. setHodel (oR) 5 ) else ( 30ptionPane..shontlessageDialog(mull, valida()); +Manuel Torres Remon private void btn! inpiarActionPerformed (java.awt.event.ActionEvent evt) £ ‘txtEdad. setText(**); txtEdad. requestFocus(); moR.clear(); rbSoltero. setSelected(true) ; chkMascul ino. setSelected (false) 3 private void btnSalirActionPerformed(java.awt .event .ActionEvent evt) £ int 1 ~ JOptionPane.shonOptionDialog(this, ‘Estas seguro de salir...2", ‘Acumuladores y Contadores', JOptionPane.vES_NO_OPTION, JOptionPane QUESTION_MESSAGE, mull, mult, mull) ; if (r -- 0) f System.exit (0) } String valida() ¢ Gf (txtdad. getText() .equals("*) || Integer.parseint(txtEdad.getText()) <0) return ‘Edad del Asistente..! 1!" } else Af (1 (rbSoltero.isSelected() || rbCasado.isSelected() || rbviudo.isSelected() || reDivorciado.isSelected())) { return ‘Estado Civil del Asistente..!!! "5 } else ¢ return "5 3 9, Ejecute la aplicacién. Una vez colocado el cédigo en los botones, presione la combinacién de teclas+ , CASO DESARROLLADO 2: Registro de alquiler (usando acumuladores) Implemente una aplicaci6n que permita apoyar al area de recepcién de un hotel. La aplicacién debe registrar los alquileres que se realizan y el nimero de personas que se hospedan. El hotel cuenta con los siguientes tipos de habitacién: Simple $2000 Doble $40.00 Matrimonial $100.00 Consideraciones: = Desarrolle la aplicacién usando la metodologia orientada a objetos con los métodos get y set, el método constructor y los atributos estaticos para los conteos y acumulaciones.Capitulo 7: Estructura de repeticién = Use el siguiente disefio de interfaz grafica: = Desde el control cuadro combinado, debe seleccionarse el tipo de habitacién. = Debe ingresar el total de dias alquilados y el nimero de personas en control de texto, = Cree una clase llamada Alquiler que defina los atributos referentes a los datos del alquiler, ademds de definir los atributos estaticos para los conteos y acumulaciones. = Debe mostrar los siguientes valores: » Costo por alquiler » Total de alquileres por tipo de habitacién » Reporte porcentual de alquileres por tipo de habitacién » Reporte de personas hospedadas por tipo de habitacién » Reporte de montos acumuulados por tipo de habitacién = Muestre el resultado de la aplicacién en un control JList. Soluci6n: 1, Seleccione la ruta File > New > Java Project. 2. Asigne el siguiente nombre al proyecto: pjAplicacion72. 3. Agregue los paquetes pFormularios y pClases. 4. Agregue un JFrame dentro del paquete pFormularios y asignele el nombre frmAlquiler.Manuel Torres Remon 5. Agregue una clase llamada Alquiler en el paquete pClases. 6. Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: R = || neoisrno ve aLquitenes ie re ar ae ee eee Dias [| enone — | xewores meen Jatt-{ vinProcesar TaPersonas AT stiesumen IstEstadisticas Figura 7.9 Controles del formulario de control de habitaciones. Resumen de controles: Clase eo 1 dhabel REGISTRO DE ALQUILERES 2 JCombobox cboHabitacion 3 STextield ttDias 4 STextField twtPersonas 5 Jhist IstResumen 6 dist IstEstadisticas 7 sButton binProcesar 8 JButton btnLimpiar 9 sButton binsalirtulo 7: Estructura de repeticion En la clase Alquiler coloque el siguiente cédigo: package pClases; public class Alquiler private private private private private private private private private private private private private { string hab tacion; nt dias; ‘int personas; static static static static static static static static static static public Aiquite: totals ) public String gettiabitacion() { int int int int int int int int int int total; tSimples tboble; tMatrimonial; pSimple; Dob Le; platrimonial; simple; Doble; nlatrimonial; return hab’ tacion’ y public void setHlabitacion(String habitacion) { this habitacion ~ habitacion; } public int getDias() { return dias; 3 public void setDias(int dias) { this.dias - dias; } public int getPersonas() { return personas; } public void setPersonas(int personas) [ ‘this. personas ~ personas; 3 public static int getTotal() { return total; y public static int gettSinple() { return ¢Sinple; } public static int gettDoble() { return toble; } iz262 Manuel Torres Remon public static int gottiatrinonial() f return + . CASO DESARROLLADO 3: Registro de venta (usando for) Una ibreria necesita tener el control de las ventas de cuadernos escolares para el ao escolar en curso. Implemente una aplicacién que permita controlar la venta de cuadernos, la cual se realiza mediante la seleccién de un producto y una cantidad determinada. Los precios de los productos son como siguen: eee ae Cuadernos LayConsa 150 Cuadernos Justus 1.90 Cuadernos Stanford 350 Cuadernos David 250 Cuadernos College 3.00 Cuadernos Alpha 450Capitulo 7: Estructura de repeticién Consideraciones: = Desarrolle Ia aplicacién usando la metodologia orientada a objetos con los métodos get y set. = Use el siguiente disefio de interfaz grafica: = Debe seleccionar un producto desde el control cuadro combinado segtin la tabla proporcio- nada en el caso. = Debe ingresar la cantidad de productos seleccionados por el cliente en un cuadro de texto. = Cree una clase llamada Venta que defina los atributos referentes a los datos de la venta, = Debe validar todos los valores ingresados mostrando un mensaje de error si fuera necesario. = Elsubtotal es el valor acumulado de la lista subtotal, para ello debe usar la estructura repeti- tiva for, ‘= Se deben imprimir todos los valores obtenidos en los controles JList. = Eldescuento representa al 10% del subtotal acumulado, Solucion: 1. Seleccione la ruta File > New > Java Project. 2. Asigne el siguiente nombre al proyecto: pjAplicacion73. 3, Agregue los paquetes pFormularios y pClases. 4, Agregue un JFrame dentro del paquete pFormularios y asignele el nombre frmVenta. 5, Agregue una clase llamada Venta en el paquete pClases,2 | ee Manuel Tores Remon 6. Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: cboProdcto once wincomprar }be aa ar |) Somes oS i ss TstDeseripcon | > TsSubtotal ! Istreco f > isantidad > | i | nazi I Ee Tbisubtotal wintimpiar | eon | cescummos 400 IbIDescuento binSalr = a | TbiNeto ira 7.10 Controles del formulario de control de venta, Resumen de controles: 1 dlabel \VENTADE PRODUCTOS 2 sCombobox coProducto 3 STextField txtCantidad 4 dabel lbisubtotal 5 dtabel IbiDescuento 6 dabel lbINeto 7 dist IstNum 8 dist IstDescripcion 9 dist \stPrecio 10 dist IstCantidad 11 dist [stSubtotal 12 JButton binComprar 13 JButton btntimpiar 14 JButton binSalirCapitulo 7: Estructura de repeticién [ar 7. Enla clase Venta coloque el siguiente cédigo: package Clases; public class venta { private int codigo; private String descripcion; private int cantidad; public int getCodigo() { return cod‘go; } public void setCodigo(int codigo) ‘this.codigo ~ codigo; } public String getDescripcion() £ return descripcion; 3 public void setDescr ipcion(String descr ipcion) | ‘this.descripcion ~ descripcion; 3 public int getCantidad() { return cant idad; 3 public void setCantidad(int cantidad) { ‘this.cantidad ~ cantidad; 3 public double asignaPrecio() { switeh (codigo) { case 0: return 1.5; case 1: return 1.9; case 2 return 3.5; case 3: return 2.5) ease 4: return 3.6; default: return 4.5; + } public double calcvlasubtotal() { return asignaPrecio() * cantidad; }erin Manuel Torres Remon El cédigo del formulario frmVenta se muestra como sigue: package pForm/larios; ‘import java. text DecimalFormat; ‘import javax.swing.DefaultListCel Renderer .UIResource; ‘import javax. swing.DefaultListModel; Amport javax.swing.JOptionPane; ‘import javax. swing. Swingconstants; ‘import pClases. Venta; public class front extends javax. swing. JFrame ( DefaultListModel moNumero ~ new DefaultListNodel(); DefaultListMadel moDescripcion ~ new DefaultListHodel () ; DefaultListModel moPrecio ~ new DefaultListModel (); DefaultListMadel moCantidad - new DefaultListModel() ; DefaultListNodel moSubtotal - new DefaultListModel() ; DecimalFormat df; int oun; public fraventat) ¢ ‘initComponents (5 cargaProductos() ; Gf ~ new DecinalFormat( "##40.60"); void cargaProductos() { cboProducto.addItem( ‘Cuadernos LayConsa " cboProducto.addTten( ‘Cuadernos Justus); cboProducto.addT tem( ‘Cuadernos StanFord " cboProducto. addTtem( ‘Cuadernos David *) cboProducto.addItem( ‘Cuadernos College cboProducto.addTtem( ‘Cuadernos Alpha); 3 private void btnConprarActionPerformed (java.awt.event.ActionEvent evt) { 4f (valida() .equals("")) { Venta objv - new venta(); ‘objV. setCodigo (getProducto()); ‘obj¥. setDescripcion(getDescr ipcionProducto()) ; objV.setCantidad (getCantidad()) 5 double precio ~ obj¥.asignaPrecio(); double subtotal ~ objV.calculaSubtotal () ; ‘mprimirListas(precio, subtotal) ; UtResource posicion ~ new UIResource() ; posicion. setHorizontalAlgrment (SwingConstants. RIGHT) ; ‘UstSubtotal.setCel Renderer (posicion) ; LinpiarControles() ;Capitulo 7: Estructura de repeticién else ( JOptionPane.showlessageDialog(nutt, ‘Error en * + valida()); } } private void btn! inpiarActionPer formed (java.awt event ActionFvent evt) { Viapiarcontroles() ; moNumero. renoveALLElenents() ; moDescripcion.renoveaLlELenents() ; moCantidad.renoveALLELements () 5 moPrecio. ronoveAL Elements () ; moSubtotal. renoveAl Elements () 5 Ybisubtotal.setText(''); UblDescuento.setText(*"); IbINeto. setText(**); rum ~ @; 3 private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) { ‘dnt r ~ JoptionPane.show0ptionDialog(this, ‘Estas seguro de salir...?%, 'Sistena de Ventas", J0ptionPane. YES_NO_OPTION, JOptionPane. QUESTION MESSAGE, pull, null, null); af (r- 0) f ‘System.exit(@); + ¥ String valida() ¢ ‘if (cboProducto.getSelectedIndex() -- -1) { cboProducto.requestFocus() ; return ‘Descripcion del Producto"; } else AF (txtCantidad. getText() -equats(**) || Integer.parseInt(txtCantidad.getText()) < @) { txtCantidad.setText(* txtCantidad. requestFocus() ; return ‘Cantidad comprada'; } else ( return * + void LinpiarControles() { cboProducto. setSelectedIndex (8) ; txtCantidad.setText(''); cboProducto. requestFocus() ; 3 void calcutatotales() { int ~ moNunero.size(); double subtotal ~ for (int i - 9; 1 + , CASO DESARROLLADO 4: Control de pago (usando modificar static) Una empresa desea tener el control de pago de sus empleados. La empresa cuenta con la siguiente informacién: nombres y apellidos del empleado, horas trabajadas, pago por hora segin el cargo y las bonificaciones por modalidad de empleo. Véanse las siguientes tablas: Gerente $20.00 Tiempo completo 20% ‘Administrative $10.00 Tiempo parcial 5% Jefe $800 Operario $350270 colle de aplicaciones con Java Manuel Torres Remon double descuento - subtotal * 6.1; double neto ~ subtotal-descuento; Ul subtotal. setText (dF, format(subtotal) ); ULDescuenta. setText (d*. format (descuenta) ); IiNeto. set Text (dF. format (neto)); Void inprinirListas(double orecio, double subtotal) ( moNumero.addélenent (num) 5 moDescr ipcion. addé Lenent (getDescr ipctonProduct moPrecio. addEienent (df. fornat(precio)); moCant idad.addE Lenent (getCantidad()) ; moSubtotal..addE Lenent (dF. Format (subtotal)); calcularotates() ; JstNum, setHodel (noNumero) ; UstDescripcion.setHadel (moDescripcion) ; LstPrecio. setNodel (noPrecio) ; [stCantidad. setModel (moCantidad) ; LstSubtotal.setHodel (wosubtotal) Os Ant getProducto() { return cboProducto. getSelectedIndex () y String getDescripcionProducto() return String. value0f (cboProducto.getSelectedItem()) ; 3 Ant getCantidad() { return Integer .parseInt(txtCantidad. getText()); } 9, Ejecute la aplicacién. Una vez colocado el cédigo en los botones, presione la combinacién de teclas + , CASO DESARROLLADO 4: Control de pago (usando modificar static) Una empresa desea tener el control de pago de sus empleados. La empresa cuenta con la siguiente informacién: nombres y apellidos del empleado, horas trabajadas, pago por hora segin el cargo y las bonificaciones por modalidad de empleo. Véanse las siguientes tablas: Gerente $20.00 Tiempo completo 20% ‘Administrative $10.00 Tiempo parcial 5% Jefe $800 Operario $350Capitulo 7: Estructura de repeticin Ti Se pide calcular: = Total de empleados registrados = Total de empleados registrados como gerentes Total de empleados registrados como administrativos Total de empleados registrados coma jefes = Total de empleados registrados como operarios = Cantidad de empleados que ganan menos a $ 1200.00 = Cantidad de empleados que ganan entre $ 1200.00 y $ 2500.00 '= Cantidad de empleados que ganas mas de $ 2500.00 Consideraciones: = Desarrolle la aplicacién usando la metodologia orientada a objetos con los métodos get y set, los modificadores static y el método constructor. = Use el siguiente disefio de interfaz grafica: m= Enun cuadro de texto, debe ingresar el nombre del empleado, asi como las horas de trabajo, = Debe seleccionar un cargo y una modalidad de trabajo a partir de controles JCombobox, = Cree una clase llamada Pago que defina los atributos referentes a los datos del pago. = Debe validar todos los valores ingresados mostrando un mensaje de error si fuera necesario. = Muestre los datos del empleado en un control JList. m= Muestre las estadisticas en un control JList.EM desarotode aplicaciones coniava8 | Manuel Tores Remon Soluci6n: 1 Resumen de controles: Seleccione la ruta File > New > Java Project. Asigne el siguiente nombre al proyecto: pjAplicacion74. Agregue los paquetes pFormularios y pClases. Agregue un JFrame dentro del paquete pFormularios y asignele el nombre frmPago. Agregue una clase llamada Pago en el paquete pClases. Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: ‘atEmpleada [> wer rmmizan ‘etHoras cboModalidad ebotarg am bbinProcesar btntstadisticas btntimpiar esas ps Istémpleado |} o> IstSueldo IstPagoxHora IstBonificacion IstEstadisticas Figura 7.11 Controles del formulario de control de pago de empleados. E Clase ea JLabel PAGO DE EMPLEADOS TextField txtEmpleado TextField twtHoras ICombobox: cboCargo JCombobox: cboModalidad list Istémpleadoz= Capitulo 7: Estructura de repeti 7 dist \stPagoxHora 8 dist \stBonificacion 9 dist IstSueldo 10 dist IstEstadisticas 11 JButton btnProcesar: 12 JButton btnLimpiar 7. Enla clase Pago coloque el siguiente cédigo: package pClases; public class Paco { private String enpleados private String corso; private String sodal ‘dad; private int horas; private static int roral private static int tGerente ~ 9; private static int tAdminstrativo ~ private static int vlefe ~ 0; private static int tOperario ~ 0; private static int cllenosi299 - ©; private static int cintrei2092500 private static int cllas?599 ~ 9; public Pago(String enpleado, String cargo, String rodalidad, int horas) { ‘this.empleado ~ empleado; this.cargo ~ cargo; this modalidad - modalidad; this horas ~ horas; totals; contadorCargos() ; contadorSueldo() } 3 private void contadorCargos() { switch (cargo) { case ‘Gerente! ‘tGerenter+; break; case ‘administrative’ tAdninistrativor+} break; case "Jefe": tlefert; break; default ‘tOperarior+;24 public double asignaPagextiora() { ‘switch (cargo) { ease ‘Gorente": return 29; case ‘dministrativo" return 10; case "Jefe" return ; default: return 3.5; public double calculaBruto’) { return this.horas * asignaPagoxHora(); 3 public double asignaBonificacion(double bruto) ¢ ‘switch (nodal idad) { case ‘Tiempo completo! return 9.2 * bruto; defautt: return 0.95 * brut; public double calculasueldo() { return calculabrute() + asignaBonificacion (calculaBruto()) ; 3 private void contadorsueldo() { if (calculaSueldo() < 1209) { cHenos1209++ } else AF (calculasueldo() < 2500) cEntrel200y2590++; } else ¢ ‘cHas2500++; 3 3 public String gettnpleado() { return enpleado; } public void setEnpleado(String empleado) { ‘this .enpleado ~ empleado; 3 public String getCargo() { return careo; 3 public void setCargo(String cargo) { ‘this.cargo ~ cargo 3 public String getiodalidad() { return modal idad; 3Capitulo 7: Estructura de repeticién [as public void setodal idad(string modalidad) { ‘this modalidad ~ modalidad; 3 public int gertioras() ( return horas; } public void setHoras(int horas) { ‘this.horas ~ horas; , public static int gotTotal() { return total; 3 public static int gettGerente() { return werente; 3 public static int getthdministrativo() { return tAdministrativos } public static int gettlefe() { return tefe; } public static int gettOperario() { return tOperar 0; } public static int getclienas1290() { return cienos1200; 3 public static int getcintre1200y2500() return cEntreiz99y2509; } public static int getclas2500() { return las2500; } 8. El cédigo del formulario frmPago se muestra como sigue: package pFormularios; ‘import javex.swing.DefaultListModel; ‘import javax. swing. JOptionPane; ‘import pClases. Pago public class frnPago extends javax.siving. JFrame { DefaultListMadel moEmpleado - new DefaultListModel() ; DefaultListMadel moPagoHora - new DefaultListNodel(); DefaultListMadel moBonificacion ~ new DefaultListModel() ; DefaultListModel moSueldo ~ new DefaultListModel (); DefaultListMadel moEstadisticas ~ new DefaultListModel() 5Manuel Torres Remon Pago obj public fenPago() { “initComponents (5 Uenacargo() 5 Uenatodalidad() § 3 void Lenacargo() { cboCargo.additen( *Gerente*) ; cboCargo. addi ten ‘Administrative '); cboCargo.addten( ‘Jefe '); cboCargo.additen( ‘Operario'); } void LlenaModatidad() { cbollodalidad.addTtem( ‘Tiempo Completo") ; cbolodalidad.addTtem( ‘Tiempo Parcial *); } String getEmpleado() { return txtEmpleado. getText() ; 3 Ant gettioras() { return Integer.parseInt(txtHoras. getText()); } String getCargo() { return String. value0f (cboCargo. getSelecteditem()) ; 3 String getodalidad() { return String. valucOf (cboNodalidad. getSelectedItem()) ; 3 String valida() ¢ Af (txtEmpleado. getText() .equals(*")) { return ‘ilonbre del Enpleado"; } else if (txthoras. getText() .equals("*) || Integer.parseInt(txtHoras.getText()) < ©) { return ‘Horas de trabajo'; } else iF (cboCargo.getSelectedIndex() -~ -1) { return ‘Cargo del enpleado'; } else 4F (cbotodalidad.getSelectedIndex() ~~ return ‘Hodalidad del empleado'; } else ( return * a) { 3Manuel Torres Remon Pago obj public fenPago() { “initComponents (5 Uenacargo() 5 Uenatodalidad() § 3 void Lenacargo() { cboCargo.additen( *Gerente*) ; cboCargo. addi ten ‘Administrative '); cboCargo.addten( ‘Jefe '); cboCargo.additen( ‘Operario'); } void LlenaModatidad() { cbollodalidad.addTtem( ‘Tiempo Completo") ; cbolodalidad.addTtem( ‘Tiempo Parcial *); } String getEmpleado() { return txtEmpleado. getText() ; 3 Ant gettioras() { return Integer.parseInt(txtHoras. getText()); } String getCargo() { return String. value0f (cboCargo. getSelecteditem()) ; 3 String getodalidad() { return String. valucOf (cboNodalidad. getSelectedItem()) ; 3 String valida() ¢ Af (txtEmpleado. getText() .equals(*")) { return ‘ilonbre del Enpleado"; } else if (txthoras. getText() .equals("*) || Integer.parseInt(txtHoras.getText()) < ©) { return ‘Horas de trabajo'; } else iF (cboCargo.getSelectedIndex() -~ -1) { return ‘Cargo del enpleado'; } else 4F (cbotodalidad.getSelectedIndex() ~~ return ‘Hodalidad del empleado'; } else ( return * a) { 3Capitulo 7: Estructura de repeticién a private void btnProcesarActionPer formed(java.aut event. Actionévent evt) { Gf (valida() -equats("")) £ ‘objP ~ new Pago(getémpleado(), getCargo(), getModalided(), gettores()); moEmpleado . addE Lement (getEmpLeado()) ; noPagotiora.addELenent(objP.asignaPagoxHora()) ; double bruto ~ ob5P.ca\culaBruto() ; moBonificacion addE Lement (objP.asignaBonificacion(bruto)) ; moSveldo.addeienent(ob}P.calcutasueldo())s LstEmpleado. setModel (moEmpLeado) ; ‘LstPagoxtora.setMadel (moPagoHora) ; AstBonificacion. setHodel (moBon ificacion) ; AstSueldo. setModel (moSue ldo) ; IstEstadisticas. setModel (nofstadisticas) ; } else ptionPene.showlessageDialog(mull, ‘EL error esté en ‘+ valida()); 3 3 private void binéstadisticastct ionPerformed(java.aut.event.Actionévent evt) £ noEstadisticas.clear(); nofstadisticas.addElenent( ‘El Total de Empleados es: "+ objP.getTotal())s mmoFstadisticas.add€lenent(*———_—- noFstadisticas. addélevent ("El Total de Gerente es: ‘robjP.gettGerente()); mmoFstadisticas.addElenent('El Total de Adninistrativos es: * + 0bjP. gettAdministrativo())3 noFstadisticas.addelenent('El Total de Jefes es: * + objP.gettlefe()); noEstadisticas addélenent( El Total de Operario est * + 0b}? gettOperario()); noEstadisticas.add€Lenent (‘——————__ mmoEstadisticas.addElenent( ‘Cantidad de empleados que ganan menos 2 $1200: "+ 0bj?.getcMenosi269()); noEstadisticas.addElenent( ‘Cantidad de enpleados que ganan $1208 y $2508: "+ objP. getcEntrel200y2500()) ; noEstadisticas.addelenent( ‘Cantidad de enpleados que ganan mas de $2508: "+ objP.geteMas2509()); 8, Ejecute la aplicacién. Una vez colocado el cédigo en los botones, presione la combinacién de teclas + .L manejo de e ambda y xcepciones Wo var c= bot | retom implementa métodos usando Lambda. Reconoce el manejo del bloque try-catch. implementa aplicaciones usando el control de excepciones lava, aa 82 33 Ba as Generalidades Expresién Lambda Bloque try-catch Clausula throw Bloque finally > Caso desarrollado 1: Registro de libros > Caso desarrollado 2: Control de pago de empleados usando LambdaCapitulo 8: Lambda y manejo de excepciones [Tae 8.1 Generalidades Cuando se desarrolla una aplicacién, ya sea en cualquier lenguaje de programacién, siempre se pensard en implementarla con cero errores; sin embargo, muchas veces no se prevé los posibles errores que un usuario puede ocasionar en la aplicacién. Esto resulta algo muy particular. Asi, por ejemplo, cuando se compra un producto en una tienda comercial, siempre nos aseguran que el aparato no tendra problemas, al menos, en varios afios; no obstante, a veces no sucede asi y quedamos algo decepcionados y sin ganas de volver a comprar en dicha tienda. Algo asi sucede con las aplicaciones, pero la vida es asi, estamos rodeados de errores. Y solo la experiencia sera la que nos permita evitar, prevenir o anticipar los posibles errores que se pueden ocasionar en una aplicacién. Dicho esto, no pensemos que controlar los errores sea complicado, sino mas bien que el control de estos no debe quedar desapercibido por el desarrollador. En Java, las situaciones que pueden provocar un fallo en la aplicacién se las denomina excepciones. Este capitulo se enfocard en mostrar la mejor manera de cémo controlarlas. Las excepciones en Java son objetos de clases derivadas de la clase base Exception. Existen también los errores internos, que son objetos de la clase Error que no estudiaremos. Ambas clases, Error y Exception, son clases derivadas de la clase base Throwable. Java implementa el cédigo de intento para controlar las excepciones que se pueden ocasionar en una aplicacién. Este bloque de cédigo protege la secuencialidad del script, de modo que, si se produce una excepcién, esta seré controlada mediante un mensaje o alguna instruccién y no permitiré devolverlo al script de la aplicacién, como ocurre con cualquier excepcién no controlada. Los errores que se pueden encontrar en las aplicaciones podrian ser: = Por divisiones entre cero, = Alintentar acceder a elementos de arreglos con un indice mayor al declarado. = Alacceder a una base de datos. = Enel manejo de archivos (existencia 0 permiso). = Errores definidos por el usuario. 8.2 Expresion Lambda Es una de las nuevas caracteristicas que presenta Java 8. Esta nos permitird simplificar bloques de cédigo que implementabamos en los métodos de devolucién de valor. Lambda, por caracte- ristica, define un proceso de forma directa, lo cual nos permitird ahorrar lineas de cédigo y nos sumergird en una nueva propuesta de implementacién de métodos. Dichos métodos ya han sido implementados por otros lenguajes de programacién. A continuacién, se muestran algunas particularidades de la definicién de Lambda: = Definiendo parémetros con especificacién de tipo de datos y devolviendo la suma de los mismos mediante la cldusula return: (int ni, dnt n2) => { return ni +92; }Manuel Torres Remon Como se trata de una sola expresién de devolucién, también podria escribirse de la siguiente manera Gint ni, dnt n2) -> ni + n25 = Definiendo parametros sin especificar el tipo de datos y devolviendo valores sin el uso de la cléusula return: (nl, m2) -> nl + nd}, = Definiendo un solo parémetro: nl => al * 2; = Definiendo sin valores de entrada y devolviendo un valor: Ont = Definiendo un tnico parémetro sin definicién de tipo, y un retorno sin valor: nl > { inprimir(ni); ) 2Cémo implementar un método Lambda en Java? Obsérvese los siguientes casos: | Método Lambda que permita sumar dos nimeros enteros. 1, Definir la interface public interface Operacion { int calcular(int nl, int 2); 3 2. Definir el método Lambda public Operacion calculasuma = (ni, n2) -> nl + n2; 3, Invocar al método Lambda ‘int sua - calculaSuma.calcular (168,59) ; Método Lambda que determine el costo basado en el nombre de un producto. 1. Definir a interface public interface Operacion { double determina (String producto) ; 3Capitulo 8: Lambda y manejo de excepciones [Tes 2. Definir el método Lambda je Operacion asignaPrecio ~ (producto) -> { ‘4F (producto.equasl( ‘Lavadora")) return 1200 Uf (producto.equasl( 'Refrigeradora*)) return 3500; else if (producto.equasl¢ ‘Cocina')) return 790; else return 0; 3 3, Invocar al método Lambda double precio ~ asignaPrecio.determina( ‘Lavadora"); 8.3 Bloque try-catch Un bloque try permite proteger un script que podria generar algin tipo de error al ejecutar una aplicacién. Formato: try } eateh(clase identificador) { 3 Dentro del bloque try se coloca todo script que pueda generar algtin tipo de error; al terminar este bloque se define un grupo de instrucciones en un bloque catch. Cada bloque catch es seguido por un paréntesis que contiene una clase y un identificador, os cuales son considerados como datos de entrada para cada seccién catch; el tipo de clase definida dentro de cada seccién catch depende del numero de excepciones que pueden ser generadas por una misma aplicacién. He aqui un script que muestra una excepcién: ‘String sSueldo~ '1000x "; double dSueldo-Double. parseDovbLe(sSuetdo) j JOptionPane.showNessageDialog(mull, "El resultado es: '+dSueldo) ; El error parece ser bien claro, pues se tiene una variable de tipo cadena con un valor inicial de 1000x que, al convertirla al tipo double, genera el siguiente error:7 | Manuel Torres Remon La excepcién se podria controlar por medio del siguiente script: try ‘String sSueldo- "1000x"; double cSueldo-Double. parseDoubLe(sSueldo) 5 3OptionPane.showMessageDialog(mull, ‘EL resultado es: } eateh(NunberFormatexception ex){ ‘JOptionPane.showMessageDialog(nutl, ex.getMessage()) 5 3 dSuetdo) ; El resultado serfa como se muestra en la siguiente imagen: Ose podria mostrar un mensaje genérico de la excepcién con el siguiente script: try ‘String sSueldo- '1900x "; double dsueldo-Double. ar sedoubLe(sSuelde) ; JOptionPane.showMessageDialog(mutl, ‘El resultado es: *+dSueldo); } eaten Exception ex){ ‘JOptionPane.showMessageDialog(mull, ‘Error en la aplicacién..!! 1); } 8.4 Clausula throw Es la cléusula que permite listar los tipos de excepcién que un método privado puede lanzar. También se la denomina lanzamiento manual de excepcidn. Sus principales caracteristicas, son las siguientes: = Se usa para proteger los métodos de una clase. = Esnecesario usarla con todas las excepciones, excepto la clase Error y RuntimeException. = Cuando se implementa un método, se tiene que especificar la clausula throw; en caso contrario, se genera un error, Formato de implementacién de un método: Visibilidad tipoDatos nonbreNetodo(Parametros) thraws nonbreExcepcion{ }Capitulo 8: Lambda y manejo de excepciones [5 Formato de implementacién de clase heredada de la clase Exception: Public class nonbreExcepcion extends Exception{ public nonbreéxcepcion() { ‘super (‘Mensajel"); } public nonbreéxcepcion(tipo valor) { super (valor); 3 A continuacién, se muestra un ejemplo de como validar un numero entero usando throw: Paso 1. Se implementa la clase validaNota con dos métodos constructores; el primero mostrard e| mensaje "Fuera del Rango". public class validaliota extends Exception: public validaliota(){ super (‘Error al convertir'); } public vel idaliota (String valor) super (valor); } Paso 2. Se implementa el método validaNumero que invoca a la clase validaNota por medio de la cldusula throws. String validalunero(int nota) throws val idaNlotat 4f (notacd || nota>20) ‘throw new yal idaNota() ; return ‘Numero valido'; Paso 3. Se implementa el bloque try-catch, el cual puede colocarse dentro del botén de accién de un formulario. try f ‘int _nota-22; String valide-validatiumero (nota) ; J0ptionPane.showMessageDialog(mull, valida); } eateh (validatiota ex) { JOptionPane. showMessageDialog(null, ex); iManuel Torres Remon 8.5 Bloque finally Esun bloque que permite ejecutar un conjunto de instrucciones, ocurra o no una excepcién contro- lada con try-catch. Normalmente es usado para liberar recursos de la aplicacién. Formato: try! } eateh(clase identificador) { ) finatty & 3 CASO DESARROLLADO 1: Registro de libros Implemente una aplicacién que permita registrar la siguiente informacién de los libros en una biblioteca: nombre del libro, tipo de editorial (A, 8 0 C), clase de libro (Programacién, Andlisis, Disefio), afio de edicién, nimero de paginas y costo del libro. La aplicacién deberd mostrar los siguientes resultados: m= Numero de libros de Andlisis de la editorial B. = Nombre del libro con el afio de edicién mas reciente. = Nombre de la editorial que tiene el libro con el menor nimero de paginas. = Nombre del libro que tenga el mayor costo. Consideraciones: = Desarrolle la aplicacién usando la metodologia orientada a objetos. = Use el siguiente disefio de interfaz grafica:Capitulo 8: Lambda y manejo de excepciones [Tar = Debe ingresar el nombre del libro, afio de edicién, numero de paginas y el costo en controles de cuadros de textos. m= Debe seleccionar un tipo de editorial, clase de libro a partir de controles Combobox. = Cree una clase llamada Libro que defina los atributos referentes al registro de libro. = Muestre los datos del registro de libros en un control JList. = Muestre las estadisticas en un control JList. Solucion: 1. Seleccione la ruta File > New > Java Project. 2. Asigne el siguiente nombre al proyecto: pjAplicacion81. 3, Agregue los paquetes pFormularios y pClases. 4, Agregue un JFrame dentro del paquete pFormularios y asignele el nombre frmRegistro. 5. Agregue una clase llamada Libro en el paquete pClases. 6. Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: wilibro ebokditoral tf ebolibro ‘baPaginas bentimpiar ‘tCosto isiCosto istibro TstARo [ \stéditorial IstPaginas TsClase C inEstadstcas ae Iststadisticas 1 dabel REGISTRO DE LIBRO 2 STextField tatLibro 3 STextField ttAnio 4 STextField twtPaginas 5 STextField txtCostoManuel Torres Remon Deca cenit 6 sCombobox cboEditorial 7 sCombobox cbolibro a dist \stLibro 9 dist IstEditorial 10 ist IstClase dist IstAno 12 dist IstPaginas 13 dist IstCosto 4 dist IstEstatisticas 15 JButton binRegistrar 16 sutton btnLimpiar 17 sButton binEstadisticas 7. En la clase Libro coloque el siguiente cécigo: package oClases; public class Libro { private string nonbre; private String editorial; private String clase; private int aio; private int paginas: private double costo; private static int tAnalisisa; public Libro(String nombre, String editor iel, String clase, int afo,int paginas double costo) { ‘this .nombre-nonbre; this editorial-edi torial; this .clase-clase; this. afo-afo: this. paginas-paginas; this .costo-costo; conteos(); , public String getNonbre() return ronbre; 3 public void setiiondre(String nonbre) ¢ tthis.nonbre ~ nonbre; 3 public String getFditorial() { return editorial; 3Capitulo 6: Lambda y manejo de excepciones [Ts public void setiditorial (String editorial) { this editorial ~ editorial; 3 public String getClase() { return clase; 3 public void setClase (string clase) { this.clase - clase; 3 public int getAno() ( return ano; y public void setAno(int aro) { ‘this. afio ~ ano; } public int getPaginas() return paginas; } public void setPaginas(int paginas) { ‘this. paginas ~ paginas; } public double geiCosto() { return costo; } public void setCosto(double costo) { this.costo - costo; } public int getTAnatisis(){ return tAnalisisb; ) void conteos(){ 4f (getClase() .equals( ‘Analisis*) && getEditorial () .equals( 'B*)) tanalisisB++; 8. El cédigo del formulario frmRegistro se muestra como sigue: package peornular ios; ‘import javax.swing.DefaultListtodel; Amport javax. swing. JOptionPane; import pClases. Libro; public class frnRegistro extends javax.swing.JFrane { Libro obj Li; DefaultListModel mol ibro,moEditor ial,moClase,moAho, moPaginas,moCosto; DefaultListModel moEstadisticas;Manuel Torres Remon public frnkepistro() ( initComponents( 5 Uenakdi torial; UenaClase() ; cargatodelos() void cargatlodelos() { ‘mol ibra-new DefaultListModel () 5 noEditorial-new DefaultListNodel(); moClase-new DefaultListModel (); noMo-new DefaultListModel() 5 moPaginas~new DefaultListNodel() ; moCosto-new DefaultListModel () ; noEstadisticas-new DefaultlistModel() ; AstLibro. setModel (moLibro) ; IstEditor ial.setModel (moEdi torial) ; IstClase. setMadel (moClase) ; IstAfio. setModel (moan) 5 AstPaginas.setModel (moPaginas) ; IstCosto. setMadel (maCosto) ; IstEstadisticas. setModel (mofstadisticas) ; void Lenavodelos() { moLibro.addElenent (objL1.getNonbre()) ; moEdi torial. addéLement (objLi .getEdi torial()) 5 moClase.addElement (objLi.getClase()); moAno.addELement (objLi. getAno() ); moPaginas.addE lenent (objLi.getPaginas())5 moCosto.addELement (objL1..getCosto()) ; void LlenaEditorial(){ ‘cboEditorial addi tem(*A"); cbotditorialaddrtem( 'B*); cboEditorial.addrtem( 'C*); void LlenaClase() ‘cboClase.addi ten ( ‘Programacién ) cboClase. addr ten( *andtisis*); cboClase addIten( ‘Diseao') 5Capitulo 8: Lambda y manejo de excepciones 23 private void btnRegistrarActionPerformed(.) { try objLi ~ new Libro(getLibro() ,getéditorial() ,getClase(), getAno() ,getPaginas() ,getcosto()); Uenatfodelos() } eateh (Exception ex) { JOptionPane.showlessageDialog(null, ‘Error en la Aplicacton * + ex.getMessage()); } String getLibro()( return txtLibro.getText } String getFditorial()¢ return String. valucOF (cbofditorial.getSelecteditem()) ; 3 String getClase() ( return String. value0f (cboClase. getSelectediten()) ; 3 mt getano(){ return Integer.parseInt(txthfo. getText()); 3 int getPaginas(){ return Intoger parser } double getCosto(){ return Double tPaginas. gotText()); arseDouble(txtCosto. getText()); 8, Ejecute la aplicacién. Una vez colocado el cédigo en los botones, presione la combinacién de teclas + . CASO DESARROLLADO 2: Control de pago de empleados usando Lambda Implemente una aplicacién que permita determinar los montos del salario de un empleado. La informacién que se debe ingresar es el nombre completo del empleado, el cargo o categoria y las, horas de trabajo mensual. Debemos tener en cuenta las dos siguientes tablas de valor: La asignacién del costo por hora se establece segtin la categoria del empleado, quedando de la siguiente manera: Jefe $50.00 Administrativo $30.00 Operario $20.00 Servicio $1000=| Manuel Torres Remon Los descuentos a su salario se establecen bajo el siguiente criterio: a ee Inferioroiguala 750, 1% Entre 751y 1250 12% Entre 1251 y2500 15% Superior 22500 17% La aplicacién deberd mostrar los siguientes resultados: = Los datos ingresados por el empleado. = Elcosto por hora segiin su categoria. = El monto de salario, m= Fl monto de descuento segin la tabla anterior. = Elmonto neto a cobrar por el empleado. Consideraciones: = Desarrolle la aplicacién usando la metodologia orientada a objetos. = Use el siguiente disefio de interfaz grafica: @ 3 x) m= En cuadros de textos, debe ingresar el nombre del empleado y las horas trabajadas. ‘= Debe seleccionar un tipo de categoria a partir del control JCombobox. = Alseleccionar una categoria, automaticamente debe mostrarse el costo por hora. = Cree una clase llamada Pago que defina las interfaces y los métodos Lambda que necesita la aplicaci6n = Muestre los datos del control de pago de empleados en un control JList.Capitulo &: Lambda y manejo de excepciones |" Soluci6n: 1, Seleccione la ruta File > New > Java Project. Asigne el siguiente nombre al proyecto: pjAplicacion82. Agregue los paquetes pFormularios y pClases. 4, Agregue un JFrame dentro del paquete pFormularios y asignele el nombre frmPagoEmpleados. 5, Agregar una clase llamada Pago en el paquete pClases. 6. Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: ‘témpleado ‘cboCategoria| TeiCosto btnRegistrar ‘twtHoras Ist Disefio del formulario de control de pago de empleados. Resumen de controles: a 1 Sabet CONTROL DE PAGO DE EMPLEADOS-LAMBDA 2 dtabel Ibicosto 3 STextField txtEmpleado 4 STextField tutHoras 5 sCombobox cboCategoria 6 dist Ist 7 sButton btnRegistrar2 | eee Manuel Torres Remon 7. Enla clase Pago coloque el siguiente cédigo: package oClases; public class Pago [ public interface operacionescadena { double calcular (String cadena); 3 public interface OperacionesParanetro { double calcular(double decimal) ; y public interface OperacionesdosParanetros ¢ double calculor(double decinal1, double decinal2); 3 public OperacionesCadena calculaCoste ~ (categoria) -> 4f (categoria.equals(‘Jefe')) { return 505 } else 4# (categoria. cquals( ‘Administrativo")) { return 305 } else if (categoria.equals( ‘Operario")) £ return 20; ) else { return 105, } public OperacionesDosParametros calculaSalarion(horas, costo) ->horas*casto; public OperacionesParametro calculaDescuento - (salario) -> { Gf (salario < 750) { return 9.7 * salario; } else Af (salario > 750 && salario < 1258) { return 0.12 * salario; } else if (salario > 1250 && salario <- 2500) { return 9.15 * salario; yp else ¢ return 9.17 * salario; 3 public OperacionesDosParanetros calaulaeto~(salarfo,descuento)->salario-descuento; 8, El cédigo del formulario frmPagoEmpleados se muestra como sigue: package Form larios; ‘import javax.swing.DefaultListiodel; import pClases Pago; public class frnPagoEmpleados extends javax.swing.JFrane { DefaultListNadel moR; Pago objP-mew Pago();Capitulo 8: Lambda y manejo de excepciones [335 8 public frnPagotmpleados() { “initConponents(); Uenacategorias() ; moR-new DefaultListModel() ; IstR.setHodel (moR) ; void LlenaCategorias(){ cboCategoria.addrtem( ‘Jefe ) ; cboCategoria.addItem( ‘Administrativo"); cboCategoria.additem( ‘Operario"); choCategor ia.addTten( "Servicio"); 3 private void cboCategor iattonStateChanged java.ant event .Ttenévent evt) { ‘String categoria-String.valueOf(cboCategoria.gerSelectedTtem()) ; double costo-0bjP.calculaCosto.calcular (categor ia) ; ThiCosto. setText (String. format("%.2F*, costo)); ) private void btrkegistrarActionPer formed java.aut.event .ActionEvent evt) { String enpleado - txtEmpleado. gettext () 5 String catogoria-String. valueOFf (choCategoria.getSelecteditem()); nt horasInteger.parseint(txtHoras.getText()); double costo-objP.calculaCosto.calcular (categoria) j double salario-obj?.calculaSalario.calcular(horas, costo) double descuento- obj?.calculaDescuento.calcular(selario) double neto-obj?.calculaeto.calcular(salario, descuento) ; moR.addELenent ("EMPLEADO: "rempleado) ; ‘moR.addElenent ("CATEGORIA: categoria) ; MOR. addELement (‘HORAS TRABAIADAS: "+horas) ; ‘moR add lenent (*———____—-); moR-addELenent( ‘COSTO POR HORA: $ '+String. format( MOR. addElenent( ‘MONTO SALARIO: $ "+String. format moRaddElenent (‘MONTO DESCUENTO: $* + ‘String. fornat ("s.2F',descuento)) ; noR.addELenent (‘MONTO NETO: $ "¢String. format( '%.2f ,costo)) 5 .2F*,galario))} Ft neto)) 5 Ejecute la aplicacién. Una vez colocado el cédigo en los botones, presione la combinacién de teclas + .Arreglos var c= Ducptices '@ Comprende los conceptos basicos de los arreglos y poder diferenciarlos por las dimensiones. Implementa aplicaciones matriciales de una y dos dimensiones, logrando asi manipular informacién masiva en una misma aplicacién. 92 33 oa Generalidades Arreglos Arreglo unidimensional Arreglo bidimensional > Caso desarrollado 1: Listado de ntimeros basico > Caso desarrollado 2: Listado de niimeros usando clase > Case desarrollado 3: Certamen de belleza > Caso desarrollado 4: Matriz de ntimeros enterosCapitulo 9: Arreglos [Te 9.1 Generalidades as variables que hemos usado en todas las aplicaciones, hasta el momento, son de tipo simple, es decir, son de una sola caja de memoria y solo pueden contener un valor cada vez. Igualmente, los tipos de datos vistos hasta ahora, como lo son entero (int) y real (double, float), también son considerados simples, puesto que solo pueden almacenar un valor a la vez; es decir, existe una relacién de uno a uno entre la variable y el elemento que es capaz de almacenar. En cambio, un dato de tipo estructurado, como los arreglos, pueden almacenar mas de un elemento a la vez, con la condicién de que todos los elementos deben ser del mismo tipo. Se exponen, a continuacién, los siguientes casos: = Leer una lista de calificaciones de un aula de clases. m= Encontrar la media aritmética de todas las calificaciones. = Listar qué alumnos tienen la calificacién més alta, m= Ordenar la lista de calificaciones en orden ascendente 0 descendente, Ahora, si se quiere registrar 100 0 200 calificaciones sin usar arreglo, tendriamos que declarar 100 0 200 variables diferentes, como, por ejemplo, calificaciont, calificacion2...calificacion200; de esta manera estariamos separando 200 variables, es decir, 200 espacios de memoria diferentes para almacenar las calificaciones. Sin embargo, esta no seria la forma mas adecuada de registrar las, calificaciones, ya que se usan muchas variables. En Java se tendria el siguiente script para declarar las calificaciones: ‘int calificacionl, calificacionl, caLificacionl, ..,calificacion209; = Calculando la media aritmética: double nediaArit ~ (calificacionltcal ificacion2+...calificacion2@8) /280; = Imprimir las calificaciones en un modelo: DefaultListHodel moCalificaciones ~ new DefaultListHodel() ; moCalificaciones..addELement (cal ificacion1) ; moCalificaciones. addE Lement (cal ificacion2) ; moCalificaciones. add Lement (cal ificacion3) ; inoCalificaciones..addE Lement (cal ificacionN) ; El equivalente al script anterior, usando arreglo, seria de la siguiente forma: ‘int calificacion(| ~ mew int(200) ;Se Manuel Torres Remon = Calculando la media aritmética: double nediahrit; for (int i-0; 1<200i++){ iediaarit += calificacion( 4] 3 mediakrit ~ mediaarit/200; = Imprimir las calificaciones en un modelo: DefaultListModel moCalificaciones ~ new DefaultlistHodel() ; for(int i-9;1<200;i++){ noCal ificaciones .addELement (calificacién[i]) ; } Ventajas y desventajas de usar arreglos = Sise conoce la posicién dentro del arreglo del elemento que se quiere consultar, la consulta toma un tiempo constante, = Se pueden utilizar para implementar otras estructuras de datos como pilas, calas, tablas hash, etc. m= El tamafio de un arreglo es fijo, por lo que, sino se conoce de antemano el numero maximo de elementos a almacenar, pueden ocurrir problemas si el espacio reservado es menor del que se necesita. = Insertar elementos de manera ordenada es muy lento. = Buscar un elemento en un arreglo desordenado es muy lento, 9.2 Arreglos Un arreglo es una coleccién de datos del mismo tipo; dichos datos se almacenan en posiciones consecutivas de memoria y reciben un nombre de variable comuin. Es decir, varios datos estarn controlados por una sola variable, Para hacer referencia a un determinado elemento del arreglo se debe utilizar el nombre del arreglo acompafiado del indice, el cual especifica la posicién relativa en que se encuentra el elemento. Los arreglos se pueden dividir en: = Unidimensionales, también llamados vectores. o [1000.00 0 1 2 3 a 5 1 [150000 1900.00 | 1500.00 | 1200.00 | 1050.00 | 2500.00 | 3000.00 2 | 120000 3 | 105000 4 | 2500.00 5 [_ 200000Capitulo 9: Arreglos [Toor = Bidimensionales, también llamados matrices o simplemente tablas. co | on 100 100 | 50 oe. [50 no | an | a2 o2 [a a | 30 | a0 ag | ad eo | av | aa 4 =] aia | 2 80 82 BI 2 {2 = Multidimensionales, cuando tienen de tres a mas dimensiones. a a aA f a / H 9.3 Arreglo unidimensional Un arreglo unidimensional es un conjunto de elementos almacenados consecutivamente, uno a continuacién del otro, donde cada elemento conserva su propio espacio con el mismo nombre para todos los elementos. Se le denomina unidimensional porque tiene un solo indice. Forma gréfica: 7 Indice «(cs [28 [35] 36 | 65 | 32} Hementos Nombre del arregio Donde: = Elnombre del arreglo es asignado dependiendo de los elementos que contiene el arreglo. Por ejemplo, un arreglo de nimeros (ndimero) 0 un arreglo de edades (edad). = El indice de un arreglo tiene como punto de inicio la posicién cero, y como iiltima posicién la cantidad total de elementos menos uno (N-1). Para recorrer por cada uno de los elementos de un arreglo se necesita una estructura repetitiva como for o while. m= Cada elemento es asignado a una posicién independiente del arreglo.oot | EAA Manuel Tores Remon Veamos: Ate] = 5 Ata) > 28 AQ] = 35 - 36 Ata] = a5 als] > 32 = Formato de declaracién de un arreglo unidimensional tipodeDatos nowbreirregiol 1; tipodatol | nonbresrreglos Donde: > TipodeDatos. Fs el tipo de datos especificado para los valores que se almacenardn en el arreglo unidimensional. Hay que tener en cuenta que todos los elementos serdn del mismo tipo. » nombreArreglo. Es el nombre asignado al arreglo. Obsérvese los siguientes casos de declaracién de un arreglo unidimensional Declarar el arreglo nombres del empleado, ntimero de hijos y pago mensual para el registro de N empleados en una empresa. Forma 1: tipoDato nombreArregiol]; String nonbres(]; int nHijos(1; double pagoensual(]; Forma 2: tipoDatol] nombreArreglo; Stringl| nonbres; int] nitijos; double(] pagotlensual; m= Formato de creacién del objeto de tipo arreglo nonbreArreglo ~ new tipoDatos[tamano] Donde: » NombreArreglo. Se especifica el nombre del arreglo ya declarado. > tipoDatos. Es el mismo tipo de datos especificado en la declaracién. > tamafio. Se especifica el total de elementos que puede contener el arreglo; hay que consi- derar que aqui no se especifica el maximo tamafio, sino el total de elementos.Capitulo 8: Arreglos [7308 Obsérvese el siguiente cas Crear los objetos de tipo arreglo para los nombres del empleado, ntimero de hijos y pago mensual de 100 empleados en una empresa. nombres ~ new String! 1°01; nifijos ~ new int 1001; pagoMensual ~ new doubte[ 100) ; = Formato para la declaracién y creacién del objeto de tipo arreglo en una linea tipodatos nonbresrreglo[] ~ new tipoDatos[tamano] Donde: > NombreArreglo. Se especifica el nombre del arreglo a declarar y crear. > tipoDatos. €s el tipo de datos especificado en la declaracién y creacién del objeto. > tamaiio, Se especifica el total de elementos que puede contener el arreglo, Obsérvese el siguiente caso: Declarar y crear los objetos de tipo arreglo para los nombres del empleado, numero de hijos y ‘pago mensual de 100 empleados en una empresa. String nonbres|) ~ new String( 109 |; int oHijos[) ~ new int 109); double pogollensual(} ~ new double( 100) ; 9.4 Arreglo bidimensional Un arreglo bidimensional es considerado un vector de vectores 0 un conjunto de elementos, todos de mismo tipo, en el cual el orden de los componentes es significativo; por lo tanto, necesitan dos Indices, all radica su principal caracteristica, Forma gréfica: 0) Joon) Joa soo [so [75 ao fan faa a |x {so eo fen | ea a |x| Los elementos se registran en una posicién de doble indice, donde el primer indice es la posicién de la fila, mientras el segundo indica la posicién de la columna; si esto es correcto, para poder registrarManuel Torres Remon sobre ella se necesitaré una estructura de repeticién doble. Se debe considerar que internamente el arreglo bidimensional trabaja de la siguiente forma: cof 100 on 50 ol 7 19 2 1 30 80 20 8 aa By 2a 12 Es decir, se visualiza como un arreglo unidimensional de valores, pero atin se mantiene el doble indice, factor indicativo del arreglo bidimensional. Formato de declaracion de un arreglo bidimensional ‘tipodato nombredrrestol] i); tipodato! |!) nonbresrregio; Donde: = TipodeDatos. €s el tipo de datos especificado para los valores que se almacenarén en el arreglo bidimensional. Hay que tener en cuenta que todos los elementos serén del mismo tipo, = nombreArreglo. Es el nombre asignado al arreglo. Hay que tener en cuenta que, a diferencia del arreglo unidimensional que solo asignaba un corchete, en el bidimensional se asignan dos bloques de corchetes: el primero para las filas y el segundo para las columnas. Obsérvese los siguientes casos de declaracién de un arreglo bidimensional: Declarar el arreglo bidimensional, numeros de tipo entero y pagos de tipo double. Forma 1: tipoDato nombreArreglo|)[]; ‘int nuneros (13 double pagos[][); Forma 2: tipoDatol}l] nombreArreglo; “mt L]L] rumeros; double(}() paz05;Capitulo 9: Arreglos [a5 Formato de declaracién de un arreglo bidimensional nonbresrregio ~ new tipoDato| tanenoF | tamaiioc Donde: = TipodeDatos. Es el tipo de datos especificado en la declaracién del arreglo. = nombreArreglo. Es el nombre asignado al arreglo. = tamafioF. Determina el maximo tamafio en filas declarado por el usuario, m= tamafioC. Determina el maximo tamafio en columnas declarado por el usuario. Obsérvese el siguiente caso: Crear el arreglo bidimensional, nuimeros de tipo entero y pagos de tipo double ya declarados. ‘uineros ~ new int[16][10]5 pagos ~ new double[10] [10] Operaciones sobre un arreglo = Ingreso de datos. Para este caso se implementard un script que permita llenar un arreglo bidi- mensional de 3x3 de ntimeros enteros. for(int i-0;1<3;1++) for(int j-0;)<3;)1*) NUG]E{]-Lnteger.parseInt(JoptionPane. showInputDialog(this, "Ingrese un nuimero*)) m= Ingreso de datos aleatorios a una matriz. Para este caso se implementard un script que permita llenar un arreglo bidimensional de 3x3 con niimeros enteros de dos cifras en forma aleatoria de numeros enteros. for(int i-0;3<3;3++) for(int -0: NOG t+) “4nt) ((89-10+1) *Math.random() +18) ; m= Recorrer por los datos. Para este caso se enviaré la matriz Nl][} al modelo moNumeros. for(int i-9;5<3;)+") for(int j-0;)<3:)++) mmoNumeros.addELement (N[4] (31) . Para este caso se acumulardn los valores contenidos en la matriz N. = Operar sobre una matri ‘int 5-9; for(int i-0;1<3;1++) for(int }-0;)<3;)+*) sent);Manuel Torres Remon CASO DESARROLLADO 1: Listado de numeros basico Implemente una aplicacién que permita registrar un arreglo unidimensional basico de 6 elementos ‘numéricos enteros y que al final determine la suma, el promedio, la longitud y el mayor elemento registrado en el arreglo. Adicionalmente, implemente un método que permita ordenar los elementos del arreglo en forma ascendente. Consideraciones: = Use el siguiente disefio de interfaz grafica m= Através del botén Mostrar debe listar los ntimeros solicitados por la aplicacién. m= Muestre los valores en un control JList. Soluciér 1, Seleccione la ruta ile > New > Java Project. 2. Asigne el siguiente nombre al proyecto: pjBasico. 3, Agregue los paquetes pFormularios. 4, Agregue un JFrame dentro del paquete pFormula 9s y asignele el nombre frmBasico.Capitulo 9: Arreglos [a7 5, Disefie la siguiente interfaz y asigne nombres a los controles como se muestra en la imagen: binMostrar ‘btnOrdenar 1st Figura 9.1 Controles del formulario de listado de arreglo. Resumen de controles: 1 dtabel ‘ARREGLO BASICO 2 dist Ist 3 sButton btnMostrar 4 sButton btnOrdenar 6. El cédigo del formulario frmBasico se muestra como sigue: package pFormlarios; ‘import javax.swing.DefaultListModel; public class frmBasico extends javay.swing.2Frane { int 2{|-new int (5); public FrnBasico() { ‘initComponents () 5 void ordenaascendente() { ‘int comp; for(int. '-0;i nayor) mayor-alt]; ¥ return mayor} 3 double calculaProned'io(4mt suns) ( return (suma*t.0/a. length) ; } Gnt calculasuma() { int <-9: for (int i-0; 1<-5;199)4 st-ali]; 3 return 5; y private void btnsostrarActionPer formed(java.awt event .Actionévent evt) { afa}-195 al3]-205 al2)~705 al3}-39; al4}-805 a[s}-155 Ant sumacalculasuma() ; double pronedio~calculaPromedio(suma) ; int mayor-determinaltayor () 5 DefaultListModel moNumeros-new DefaultListModel(); for(int i-0;i<-5; 14+) rnoNumeros.addelenent (a4); } moNuneros.addElement( ‘La suma es: ‘+suma); moNumeros.addELement (‘EL Promedio es: "+promedio) ; moNuneros.addElenent( ‘La Longitud: 'va.length); moNumeros.addE lement( ‘EL Mayor es: ‘+mayor); 1st. setModel (moNumeros) ; Fjecute la aplicacién. Una vez colocado el cédigo en los botanes, presione la combinacién de teclas + .Capitulo 9: Arreglos, iE) CASO DESARROLLADO 2: stado de numeros usando clase Implemente una aplicacién que permita registrar un arreglo unidimensional basico de 6 elementos ‘numéricos enteros y que al final determine la suma, el promedio, la longitud y el mayor elemento registrado en el arreglo. Adicionalmente, implemente un método que permita ordenar los elementos del arreglo en forma ascendente. Debe implementar la clase ArregloUnidimensional que permita controlar todos los métodos de la aplicacién, Consideracione: m= Cree un arreglo para los nuimeros dentro de la clase arregloNumeros. = Implemente los siguientes métodos dentro de la clase arregloNumeros: , El método constructor, que se encargard de crear el arreglo numérico de 6 nimeros, Inicialice los valores del arreglo con los siguientes numeros: 10, 20, 70, 30, 80 y 15. El método tamajio, que devolverd el numero de elementos registrados en el arreglo, El método ordenaAscendente, que se encargaré de ordenar los nimeros registrados en el arreglo en forma ascendente. Elmétodo determinaMayor, que se encargard de obtener el mayor elemento del arreglo. Elmétodo calculaPromedio, que se encargar de promediar los numeros del arreglo. El método calculaSuma, que se encargaré de sumar todos los elementos del arreglo, El método devuelveValor, que se encargard de devolver el elemento contenido en el arreglo de uno en uno. m= Use el siguiente disefio de interfaz: bbinMostrar ‘btnOrdenar Ist ira 9.2 Formulario de arreglo basico,EDM desaroloce aplicaciones on ava 8 | Manuel Tores Remon Solucion: 1. Cree un nuevo proyecto en NetBeans llamado pjUnidimensional. 2 3. Agregue la clase frmNumeros al paquete pFormularios; para ello, haga clic derecho sobre el paquete pFormularios. Luego siga la ruta New > JFrame Form.Capitulo 9: Arreglos a 4. Asigne un nombre a cada uno de los controles como se muestra en la figura 9.2; para ello, haga clic derecho sobre el objeto y seleccione Change Variable Name... 5. Después de asignar nombres a los objetos, asegtrese de que los controles sean los correctos; para ello, visualice el panel Navigator, el cual debe mostrarse como la figura 9.3. 15 fom fotos © © one corerens °o a (a Dect st) (al Seorrer (mtn) crore sat gate ab Figura 9.3 Listado de controles desde la ventana Navigator. 6. Asigne Null Layout al setLayout del Frame haciendo clic derecho sobre el Frame. 7. AlFrame active el Form Size Police con el valor Generate Resize Code, 8. Asigne las siguientes propiedades a los controles: btnMostrar Text MOSTRAR btnOrdenar Text ‘ORDENAR (stk Border TitledBorder=Listado de Nimeros Model Dejarvacio El siguiente script muestra el contenido de la clase arregloNumeros: package Clases; public class arregloNumeros { private int 2[]; publi arregloNumeros() ernew int [5]; afo}=105 a[1]-20; [21-795 a[3]=305 a[4]-805 a[s}-155 } public int tansfio(){ return a. length; }m7 | Manuel Torres Remon ‘int tonp}; for (int. $-0;4 mayor) { mayor~pronedio[ i]; posicton=f; } 3 return mayors } public String gonadora(){ rata rewbre Lpastctonds Se declaran los atributos de la clase nombre y promedio de tipo Arreglo. Pos es el atributo encar- gado de posicionarse dentro de los indices del arreglo; y posicién tendré la isin de obtener la posicién de la candidata ganadora, es decir, al momento de encontrar ala ganadora, ubica en qué osicién del arreglo se encuentra este valor, el cual se guardard en la variable posicién, ya que otro método solicitara dicho valor para determinar el nombre de la ganadora,Capitulo 9: Arreglos [7 El método constructor crea los objetos de tipo Arreglo con una capacidad de 100 elementos, es decir, tendremos como méximo 100 candidatas que se podrian registrar en la aplicacién. Ademas, se inicializa la variable pos en cero, ya que es el punto de inicio de un arreglo. El método registraCandidata permite enviar los nombres y el promedio de una determinada candidata en la posicién actual de los arreglos. Al final, se aumenta en uno la variable pos, ya que asi se posicionaré en un valor mas el indice del arreglo para la siguiente candidata. Los métodos devuelveNombre y devuelvePromedio permiten devolver los valores registrados segiin la posicién del indice. El método totalCandidatas devuelve el total de participantes registradas hasta el momento. E| método puntajeAlto permite devolver cual es el puntaje més alto y, a la vez, registrar en qué posicién del arreglo se encontré dicho valor, el cual lo guardara dentro de la variable posicién. £1 método ganadora permite devolver el nombre de la candidata ganadora segtin la posicién obtenida en el método puntajeAlto, El siguiente script muestra las librerias y la declaraci6n de las variables globales de la aplicacién: package pFormular los; Jmport java. text.DecimalFormat; ‘import jovox.swing.DefaultListModel; Amport javax. suing. JOptionPane; import pclases.arrezlo; public class frnCertanen extends javax.swing.JFrane { arreglo aCan ~ new arreglo(); DefaultListModel moCandidatas - new DefaultListModel(); DefaultListMadel moPronedio - new DefaultListModel() ; DefaultListModel moEstadisticas ~ new DefaultListModel() ; DecimalFormat df}; public frncertamen() { “ini tConponents() 5 f= new DecinalFormat( *#9.89); Usaremos la libreria DecimalFormat para redondear los puntajes obtenidos. También se declara en forma global el objeto aCan de la clase arreglo. Luego se definen los modelos a usar en la apli- cacién y finalmente se declara df como objeto de la clase DecimalFormat. En el método constructor de la clase frmCertamen se declara el objeto df como instancia de la clase DecimalFormat con un formato de solo 2 decimales. El siguiente script muestra los métodos de la clase frmCertamen: ‘String getnonbre(){ return txtCandidata.getText(); y double gethuntaiel(){ return Double. parseDouble(txtPuntajel.getText()); }318) |< desarrollo de aplicaciones con ova 8) Manuel Tores Remon double getPuntaje2() return Double. parseDoubLe(txtPuntaje2.getText()) 5 } double geruntaje3(){ return Double. parseDouble(txtPuntaje3.getText()) 5 3 double calculaPromedio() { return (getPuntajel () +getPuntaje2() +getPuntaje3())/3.0; y void imprimir (){ noCandidatas.clear() ; moPromedio.clear(); mokstadisticas.clear(); for(int 1-9; i 100) { txtPuntajel.setText("'); ‘txtPuntajel. requestFocus() return "Puntaje 1"; Jelse if (extPuntaje2. getText() equals("*) | Double. parsebouble(txtPuntaje2.getText())<@ | | ar seDouble(txtPuntaje2.getText())>108) { txtPuntaje2.setText(""); ‘txtPuntaje2. requestFocus(); return "Puntaje 2"; Jelse if(txtPuntaje3.getText() equals(*") | Double. parseDouble(txtPuntaje3.getText())<@ | | Double. parseDouble(txtPuntaje3. getText())>109) { txtPuntaje3.setText('); ‘txtPuntaje3. requestFocus(); return ‘Puntaje 3; } else return 115318 Capitulo 8: Arregios El siguiente script muestra las instrucciones de! botén btnRegistrar: private void binvegiscrarctionPerformed(n) & try! 4# (valida() -equats(*"))£ String candidata ~ getnorbre(); double puntajel-getPuntajel(); double puntaje2-getPuntaje2(); double puntaje3-getPuntaje3(); aCan.registraCandidata(candidata, calculaPronedio()); Sinprimir() Linpiar (5 jelse BOptionPane.showlessageDialog(ml, "Error en "ivalida() } eateh Exception ex){ 3OptionPane.showessageDialog(mull, "Error en la Aplicacién"); } Dentro del botén btnRegistrar se implementa un try-catch para prevenir algunas excepciones que se pudieran ocasionar en la aplicacién, Luego se valida la entrada de los valores a la aplicaci6n; sitodo es correcto, se capturan dichos valores y son enviados a la clase por medio del objeto aCan. En el caso de que el método valida devuelva una respuesta, esta sera impresa. El siguiente script muestra las instrucciones del botén btnEstadisticas: private void btnfstadisticasActionPerformed(..) { ‘int total-aCan. totalCandidatas() ; moEstadisticas.clear(); moEstadisticas.addElenent( ‘El Total de Candidatas es: ' + total); moEstadisticas.addélenent( ‘La ganadora es: '+aCan.ganadora()); moEstadisticas.addElenent( ‘EL Maximo puntaje es: "+ df. format (aCan.puntajeAlto())) ; Ast€.setiodel (noEstadisticas) ; CASO DESARROLLADO 4: Matriz de nimeros enteros Implemente una aplicacién que genere un arreglo bidimensional de numeros enteros de dos cifras, en forma aleatoria, de acuerdo a una cantidad de filas y columnas ingresadas por el usuario. Su tamafio como maximo serd de 3x3. Consideraciones: = Declare como atributos privados la cantidad de filas (f), la cantidad de columnas (c} y un arreglo bidimensional N, = Cree la clase ArregloBiNumeros con los siguientes métodos: » Elmétodo constructor, que defina la cantidad de filas y columnas de la matriz y, ala vez, genere los numeros aleatorios de la matriz. > Elmétodo que devuelva la cantidad de filas definidas para la matriz. » Elmétodo que devuelva la cantidad de columnas definidas para la matriz.Manuel Torres Remon » Elmétodo obtener, que devuelva el elemento del arreglo matricial dependiendo de la posi- cién de la fila y la columna, > Elmétodo generar, que permita generar automticamente valores numéricos de 2 cifras. > Elmétodo sumaFila, que permita sumar una determinada fila ingresada por el usuario. Se utiliza JOptionPane.showinputDialog(). > Elmétodo sumaColumna, que permita sumar una determinada columna ingresada por el usuario. Se utiliza JOptionPane.showInputDialog(). m= Use el siguiente disefio de interfaz: txtFilas ‘txtColumnas ‘tNumeros 3ScroliPanel] btnFilas {+ SUMADEFILAS } | SUMADECOLUMNAS btnColumnas Resumen La Suma de la Fila 2 es: 251 IstResunen Figura 9.6 Formulario de matriz de niimeros.Capitulo : Arreglos, Soluci6n: 1. Cree un nuevo proyecto en NetBeans llamado pjBiNumeros. 2. Agregue el paquete pFormularios al proyecto pjBiNumeros. 3. Agregue el paquete pClases al proyecto pjBiNumeros. 4. Agregue la clase ArregloBiNumeros al paquete pClases. =a? | eee Manuel Tores Remon 5. Agregue la clase frmBiNumeros al paquete pFormularios. 6. Asigne un nombre a cada uno de los controles como se muestra en la figura 9.6; para ello, haga clic derecho sobre el objeto y seleccione Change Variable Name... 7. Después de asignar nombres a los objetos, aseguirese de que los controles sean los correctos; para ello, visualice el panel Navigator, el cual debe mostrarse como la figura 9.7. Figura 9.7 Listado de controles desde la ventana Navigator. 8, Asigne Null Layout al setLayout del Frame haciendo clic derecho sobre el Frame. 8. Seleccione el formulario y en la propiedad Form Size Police modifique el valor encontrado por Generate Resize Code.Capitulo 8: Arreglos |" El siguiente script muestra el contenido de la clase ArregloBiNumeros: package oClases; public class ArrogloBiNumeros { private int fc; private int 9/)/]5 public ArregloBiNuneras (int f, mt c){ this. fF; this.cmc} new int (F](c); generar(); } public int getFilas(){ return *3 3 public int getColunnas(){ return c; 3 public int obtener(int pos, imt posc){ return n[posé }[pos¢) 5 } private void generar (){ for(int i-0;i EEE rvs El siguiente script muestra las instrucciones del botén btnGenerar: private void btnGenerarActionPer formed( java.awt event ActionEvent evt) { tryt moRespuesta.clear(); ‘int filas~getFiles(); Ant. colunnas-getColumnas() ; if (ilas>@ && colunnas>® && filas<-3 && columas<~3){ aN-new ArregloBiNuneros(filas, colunnas) ; Listar(); jelse ‘OptionPane. showtessageDialog (mult, "Error de Datos"); Jeateh(Fxception ex){ OptionPanc.showessageDialog(ml, ‘Error de Ingres de Datos); 3 El siguiente script muestra las instrucciones del botén btnFilas: private void binFilasAct ionPer formed (Java.awt-event.ActionEvent evt) { ‘int f-Integer.parselnt (J0ptionPane.chowInputDialog (this, "Ingrese un ‘numero de Fila: *)); 4f (fogetFilas()) mensaje('El numero de Filas es superior a la matriz" else moRespuesta.addElement (‘La Suma de la Fila ‘+ f + tes: + aN. sunaFila(f). Se declara la variable local fy se le asignar un nmero de filas que el usuario ingresaré mediante un cuadro de dialogo de entrada. Luego se compara si dicho valor no sobrepasa el limite de la ‘matriz; si es asi, se envia un mensaje al usuario; de lo contrario, se invoca al método sumaFila de la clase ArregloBiNumeros mediante el objeto An. El siguiente script muestra las instrucciones del botén btnColumnas: private void binColumnasActionPer formed (java.awt-event .ActionEvent evt) { ‘int cv Integer.parseInt (J0ptionPane. showInputDialogithis, "Ingrese un ‘numero de Colunna: *}); 4f (cogetColumas()) mensaje(*El numero de Columas es superior a la matriz else ‘moRespuesta.addélement (‘La Suma de la Columa t+ ¢ + ‘es: ‘aN. sunaColuma(c)) 5 Se declara la variable local cy se le asignaré un numero de columnas que el usuario ingresard mediante un cuadro de diélogo de entrada. Luego se compara si dicho valor no sobrepasa el limite de la matriz; si es asi, se envia un mensaje al usuario; de lo contrario, se invoca al método sumaColumna de la clase ArregloBiNumeros mediante el objeto An.Vector de objetos y ArrayList queer e = b.0pe | eto ™ Reconoce un vector de objetos m_ Emplea vectores de objetos en aplicaciones comerciales. 10.1 Vector de objetos 10.2 Clase ArrayList » Caso desarrollado 1: Mantenimiento de empleados (vector de objetos) » Caso desarrollado 2: Mantenimiento de facturas (ArrayList) » Caso desarrollado 3: Mantenimiento de productos (ArrayList y Lambda)Capitulo 10: Vector de objetos y ArrayList [73s 10.1 Vector de objetos Los vectores de objetos son colecciones de tipos de datos definidos por el programador o que forman parte de la API JAVA y que son referenciados desde el arreglo. Si tenemos una clase llamada Personal, podemos crear muchos registros del personal, pero se perderian los valores. Ahora bien, siimplementamos un arreglo de la clase Personal, estariamos ena capacidad de almacenar muchos registros del personal dentro de un vector y no perderiamos, la informacién anterior al ultimo registro. Las aplicaciones que se implementardn en los casos desarrollados serén de mantenimiento de registros: agregar, modificar, eliminar y listar, asi como sucede cuando se trabaja con un motor de base de datos. Forma grafica arregloPersonal 0 12 ? Cédigo : AdmooL Cédigo : Adm003 Nombre: Angela Torres Nombre: Luz Lazaro Cargo: Secretaria! Cargo: Secretaria | Sueldo ; 1500.00 Sueldo : 1500.00 ‘Cédigo. : Admoo2 Nombre: Fernanda Torres Cargo: Secretaria Il Sueldo : 1200.00 Debemos considerar que la clase Personal contiene los parametros cédigo, nombre, cargo y sueldo, y que arregloPersonal es un arreglo unidimensional de tipo Personal, y que al registrar al primer personal seré en la posicién 0 del arregloPersonal, Formato de deciaracién del vector de objetos: NombreClase[] []_nonbrevector ; Donde: = NombreClase. Es el nombre de la clase implementada previamente ala declaracién del arreglo. = nombreVector. Es el nombre asignado al vector de objetos. Hay que tener en cuenta que no debe ser igual al nombre de la clase.Manuel Torres Remon Formato de creacién del vector de objetos: nonrrevector = new Nonbreclase[Numero] ; Donde: = nombreVector. Es el nombre del vector declarado previamente. = NombreClase. Es el nombre de la clase dela cual se va a crear el vector. = Numero. Define el niimero total de elementos a registrar en el vector de objetos. 10.2 Clase ArrayList La clase ArrayList permite tener un control de los datos realizando el mismo trabajo de un vector de objetos; esta clase dispone de diversos métodos para manipular una coleccién de objetos dinémicamente. Formato para crear un ArrayList: ArrayList objeto ~ new ArrayList < nonbre clase > (); Donde: m= ArrayList. Es la representacién de la clase ArrayList. m= nombre_clase. Es el nombre de la clase que se creard en el vector. = Objeto. Es el nombre asignado al ArrayList. Por ejemplo, tenemos: ArrayList prod ~ new ArrayList ()} Métodos que componen la clase ArrayList Cons Desi ‘add (Object) ‘Agrega un elemento al final. public void adicionar (Producto x){ prod. add(x) ; add(Gnt, Object) Agrega un elemento en a posicion especificada en el primer parémetro, prod.add(9,x)5 clear) Blimina todos los elementos. prod.clear(); get (int) Devuelveel elemento de a posicién especificada public Producto obtener (4nt pos) { return prod. get (pos); yCapitulo 10: Vector de objetos y ArrayList 331 indexOf (Object) remove (int) remove (Object) set(int, Object) size() Devuelve el indice del elemento especificado, de no encontrarlo devuelve -1 public int posicion(Producto x){ return prod. indexOF (x); } Elimina el elemento de la posicion especificada, public void clininar(int x)< prod. remove(x) } Elimina el elemento especificado public void eliminar (Producto x)¢ prod. remove(x) + Reemplaza el elemento de la posicién especificada en el primer pardmetro por el elemento del segundo parametr. public void modificar(imt pos, Producto x){ prod. set (pos, x); + Devuelve la cantidad de elementos agregadios. public int tanano() { return prod.size() 3 CASO DESARROLLADO 1: Mantenimiento de empleados (vector de objetos) Implement una aplicacién que permita realizar el mantenimiento de los empleados de una empresa, para lo cual se deben crear tres clases dentro de sus respectivos paquetes: la clase Empleado (clase que controla los atributos privados del empleado y los métodos set y get), la clase ArregloEmpleados (clase que maneja el vector de objetos)y la clase frmMantenimiento (clase que interacta con el usuario a través de la GUI) Consideraciones: Dentro de la clase Empleado se deben implementar: = Los atributos privados del empleado como cédigo, nombre, horas y tarifa, = Elmétodo constructor que inicialice los atributos. m= Los métodos get de todos los atributos. = Los métodos set de todos los atributos.Manuel Torres Remon Dentro de la clase ArregloEmpleados se deben considerar los siguientes aspectos: = Declare como privado el arreglo unidimensional aEmp de tipo Empleado y el indice. = Implemente los siguientes métodos: » Elmétodo constructor, que inicialice el vector de empleados en 100 elementos y un indice en cero. » Elmétodo adiciona, que se encargaré de registrar un empleado en el arreglo e incremen- tard el indice por cada empleado registrado. » El método getTamaiio, que devolveré el tamafio del vector, es decir, el total de empleados registrados. » El método obtener, que devolverd la matriz de elementos de acuerdo a la posicién en el arreglo, » El método eliminar, que dependiendo de la posicién del cédigo buscado deberd eliminar a todo un registro del arreglo de objetos. » Elmétodo buscar, que serd el encargado de comparar si el cédigo ingresado existe en la matriz 0 no, deberd devolver, dependiendo de lo anterior, el indice de la posicién del elemento encontrado; en caso contrario, devolveré =1, Use el siguiente disefio de interfaz: cD MANTENMENTO DE EVELEADOS ‘waCodio [t+ ce ore <+4L{[tempieado tattioras; Ps a usw btnlistar oetTarifa_L ye i rnReistrar > | seostoe | scoron | come | eamen btnModifcar btnGrabar fi ege Tares =" ‘0000 benconsutar ||) 2 Sfiawe" 1 es btnéliminar - a temleados btnSalir sR Figura 10.1 Formulario de mantenimiento de empleado Solucion: 1 2 3. Cree un nuevo proyecto en NetBeans llamado pjEmpresa, ‘Agregue el paquete pFormularios al proyecto pjEmpresa. ‘Agregue el paquete pClases al proyecto pjEmpresa.Capitulo 10: Vector de objetos y ArrayList [Ts 4 Agregue la clase Empleado al paquete pClases. Agregue la clase ArregloEmpleados al paquete pClases. 6. Agregue la clase frmMantenimiento al paquete pFormularios. 7 Asigne un nombre a cada uno de los controles como se muestra en la figura 10.1; para ello, hhaga clic derecho sobre el objeto y seleccione Change Variable Name... 8, Después de asignar nombres a los objetos, asegurese de que los controles sean los correctos; para ello, visualice el panel Navigator, el cual debe mostrarse como la figura 10.2. (ao bec (mtn) ‘ae soba Label Figura 10.2 Listado de controles desde la ventana Navigator. 9. Asigne Null Layout al setLayout del Frame haciendo clic derecho sobre el Frame. 10, Seleccione el formulario y en la propiedad Form Size Police modifique el valor encontrado por Generate Resize Code. El siguiente script muestra el contenido de la clase Empleado: package Clases; public class Enpleado { private int cod%g0; private String nombre; private int horas; private double tarifa; public Enpleado(int codigo, String nombre, int horas,double tari fa){ ‘this .codigo-cod igo; ‘this :nonbre-nonbre; this horas-horas; this. tarife-tarifa; y publie int getCodigo() { return codigos 3Manuel Torres Remon public void sotCodigo(int codigo) { ‘this.codigo ~ codigo; 3 public String getNonbre() ¢ return nombre; 3 public void setNionbre(String nombre) { ‘this.nombre ~ nombre; y public int getHoras() { return horas; } public void setHoras(int horas) { ‘this horas - horas; } public double getTarifa() < return tarifa; 3 public void setTorifa(double torifa) { ‘this. tarifa - tarifa; 3 El siguiente script muestra el contenido de la clase ArregloEmpleados: package oClases; Amport javax. swing. JOptionPane; public class ArregloEnpleados { private Enoleado af[); private int indice; public ArregloEmpleados() { 3€-new Enpleado[ 198] ; ‘indice-9; public void adiciona(Empleado objénp){ aE indice] -objenp; indices; public Enpleado devolver (int pos) { return af [pos]; 3 public int getTanaio){ Feturn indices 3Capitulo 10: Vector de objetos y ArrayList 335) public int buscar (int codigo) { for(int 1-93 i Elmétodo agregar, que se encargard de registrar una factura en el ArrayList. » Elmétodo getTamafio, que devolverd el tamafio del ArrayList. » Elmétodo obtener, que devolveré todos los datos registrados de la factura de acuerdo a la posicién en el ArrayList. » El método buscar, , que serd el encargado de comparar si el ntimero de Factura ingre- sado existe en la matriz o no, deberd devolver, dependiendo de lo anterior, e! objeto de la Factura encontrado; en caso contrario, devolverd null. Aqui se debe utilizar ja estructura for de la siguiente forma: for(Clase varReferencia : NonbreDelAarrayL ist) { return varReferencia; P Ej: Si tenemos la Clase Personal y quisi¢ramos buscarlo por su codigo de tipo int, dentro del ArrayList Per, ingresamos lo siguiente: publi Personal buscar (4nt codigo) { for( Personal p : Per) { if ( p.getCodigo() ~~ codigo ) return p; } return null; » El método eliminarque, dependiendo del tipo, deberé eliminar el objeto analizado del ArrayList. ‘ArregloFactura “Tact: ArrayList sindice: int varregloFacturas() +getTamano(): dnt sogregar (f:Factura) ‘obtener (pos:int): Factura sbuscer(nun:4nt): Faetura +eLiminar (x:Faetura) Adicionalmente, se deben implementar en la Clase ArregloFacturas los siguientes métodos: = Elmétodo que retorne el nombre de! empleado que tiene la venta més alta = Enel formulario disefie las opciones de mantenimiento como registrar (para un nuevo registro de factura generando el niimero de factura de forma correlativa), consultar (que permite buscar una determinada factura), modificar (que permite modificar el nombre del vendedor yCapitulo 10; Vector de objetos y ArrayList [a el monto registrado, mas no el numero nila fecha, ya que estos son autogenerados) y eliminar (que de acuerdo a un determinado objeto deberd eliminar un registro de factura del ArrayList). Use el siguiente disefio de interfaz: Tan IC a0 are arte det ec ire opine cia = ic eae Tinker nrbaringrso benconsitar nkocear bincrabsrMositade} I] Fy ‘aa usta ‘eon bangin 2 toaa) feo Tores ovo anise 3 peo Famanan Tones io TeoiPaneh Figura 10.3 Formulario de registro de ventas. Solucion: 1. Cree un nuevo proyecto en NetBeans llamado pjArrayList. 2. Agregue el paquete pFormularios al proyecto pjArrayList. 3. Agregue el paquete pClases al proyecto pjArrayList. 4. Agregue la clase Factura al paquete pClases. 5. Agregue la clase ArregloFacturas al paquete pClases. 6. Agregue la clase frmMantenimiento al paquete pFormutarios. ie un nombre @ cada uno de los controles como se muestra en la figura 10.3; para ello, haga clic derecho sobre el objeto y seleccione Change Variable Name...30 | eee Manuel Torres Remon 8. Después de asignar nombres a los objetos, asegtirese de que los controles sean los correctos; para ello, visualice el panel Navigator, el cual debe mostrarse como la figura 10.4, Figura 10.4 Listado de controles desde la ventana Navigator. 9, Asigne Null Layout al setLayout del Frame haciendo clic derecho sobre el Frame. 10, Seleccione el formulario y en la propiedad Form Size Police modifique el valor encontrado por Generate Resize Code, El siguiente script muestra el contenido de la clase Factura: package Clases; public class Factura f private int Factura; private String fecha: private String vendedors private double onto; public Factura(int nFactura,String fecha, String vendedor double monto) this.nFactura-nFactura; this. fecha fecha; this. vendedor-vendedor; this monto-nonto; y public void setNfactura(int oFactura){ ‘this.nFactura-nFactura; 3 public void setFecha(string fecha) { ‘this. fecha- fecha; 4 public void setVendedor (String vendedor) { ‘this. vendedor-vendedor; 3 public void setHionto(double nonto) { ‘this monto-nonto; yCapitulo 10: Vector de objetos y ArrayList 343 public int getNifactura(){ return nFactura; } public String yet fecha(){ return fecha; } public String getVendedor () return vendedor; } public double gottionto() ( return onto; 3 El siguiente script muestra el contenido de la clase ArregloFacturas: package pClases; Amport java.utit.ArrayList; public class ArregloFacturas { private ArrayList fact; private int indice; public ArregloFacturas() { fact-mew ArrayList (); } public int getTamano() { return fact.size(); 3 public void agregar (Factura F){ fact.add(F) ; y public Factura obtener (int pos) { return fact.get (pos) ; 3 public Factura buscar (4mt nun) { for (Factura f: fact) if (f.getNfactura()--nun) return f; return null; public void elininar(Factura x) { fact. removes); +saa Manvel Tere Ramon El siguiente script muestra las librerias y variables globales de la clase frmMantenimiento: package 2rorm.larios; Amport java.util.GregortanCalendar; ‘import javax. swing.JOptionPane; ‘import javax. swing. table. TableColum; import pClases.ArregloFacturas; ‘import pClases.Factura; public class frnventa extends javox.swing.JFrane { ArregloFacturas f-new ArregloFacturas() ‘int cun-9; public frnventa() { ‘initComponents (); DefinrAnchos(); asignaFecha(); habiLitaCajas( false) ; btnGrabarIngreso.setVisible( fal btnGrabarMod:ficado. setVisible(fal oH void DefinirAnchos() { TableColumn columna; colunna~tFacturas..getColumModel() .getCoLumn (8) ; colunna.setPreferredwidth(3®) ; colunnaétFacturas. getColumModeL() . getColumn (1) ; colunna. setPreferredwidth (59) ; colunna~tFacturas.getColumnModel() .getCoLumn(2) ; colunna. setPreferredwidth (150); columna~tFacturas..getCoLumnodel () .getCoLumn(3) ; colunna.setPreferredwidth(7@) ; ‘tFacturas. getTableHeader () .setReorder ingALlowed (false) ; tFacturas. getTableHeader () .setResizingAl lowed (false) ; 3 void habiLitacajas(boolean opcion){ ‘txtNfactura.setEditable(opcion) ; ‘txtVendedor . setEditable(opcion) ‘txtNonto. setédi table (opcton) ; ‘txtFechaVenta. setEdi table (opcion) ; Limpiacajas(){ ‘txtNfactura.setText( txtVendedor .setText ( txtFechaVenta.setText ( txtMonto.setText(*");Capitulo 10: Vector de objetos y Arrayl 45 void LinpiaMatriz(){ for(int 1-9; 1<19; i++) ‘tFacturas.setValuent(**, 1, )3 tFacturas.setValueAt("") 4, 1D} tFacturas.setvaluest(*", i, 2); tFacturas.setValueat(*", i, 3); 3 } public int generaNunero() { Feturn oun} public int getNunFact(){ return Integer.parseInt (txtNfactura.getText()); } public String getrecha()( return txtFechaventa.getText(); } public String getVendedor (){ return txtVendedor.getText() ; } public double getvionto() { Feturn Double. parscdouble(txtNonto. getText()) 5 ) void listar(){ 4 (F.getTamano()>0) { for(int 1-0; i Elmétodo constructor, que inicialice el arreglo de prod de tipo ArrayList. » Elmétodo agregar, que se encargard de registrar un producto en el ArrayList. » Elmétodo totalProductos, que devolvers el tamafio del ArrayList. Use métodos Lambda, > Elmétodo obtener, que devolverd todos los datos registrado del producto de acuerdo a la posicién en el ArrayList.ESTES. desaroic de aplicaciones con lava} Manuel Torres Remon > Elmétodo buscarProducto, que seré el encargado de comparar si el cédigo de producto ingresado existe en la matriz o no, deberé devolver, dependiendo de lo anterior, el objeto del producto encontrado; en caso contrario, devolveré null. > Elmétodo eliminar, que dependiendo del tipo de objeto deberd eliminarlo del ArrayList. ArregloProductos =prod: ArrayList *ArregloProducto() +total Productos () :Lambda +agregaProducto(objP: Preduete) sobtener(): Producto +buscarProducto(c seLiminaProducto(objP: Predueto) Finalmente, en el formulario disefie as opciones de mantenimiento como grabar (para un nuevo registro de producto generando el cédigo de forma correlativa), buscar (que permite buscar un determinado producto), modificar (que permite modificar el nombre y los datos del producto} yeliminar (que de acuerdo a un determinado objeto deberd eliminar un registro de producto del ArrayList) Use el siguiente disefio de interfaz: bingenerar TbiCodigo ‘ptDescripcion| + =| == ‘btnGrabar cs a btnModificar ‘txtPrecio [+ Ee btntister a ae] btnEliminar wxtstock |-+ [cvocata aad btnBuscar btnGrabarM Productos ira 10.5 Interfaz del mantenimiento de productos. Soluciér 1. Cree un nuevo proyecto en NetBeans llamado pjMantenimientoProductos. 2 Agregue el paquete pFormularios al proyecto pjArrayList. 3. Agregue el paquete pClases al proyecto pjArrayList. 4. Agregue el paquete pimagenes al proyecto. 5. Agregue la clase Producto al paquete pClases.ESTES. desaroic de aplicaciones con lava} Manuel Torres Remon > Elmétodo buscarProducto, que seré el encargado de comparar si el cédigo de producto ingresado existe en la matriz o no, deberé devolver, dependiendo de lo anterior, el objeto del producto encontrado; en caso contrario, devolveré null. > Elmétodo eliminar, que dependiendo del tipo de objeto deberd eliminarlo del ArrayList. ArregloProductos =prod: ArrayList *ArregloProducto() +total Productos () :Lambda +agregaProducto(objP: Preduete) sobtener(): Producto +buscarProducto(c seLiminaProducto(objP: Predueto) Finalmente, en el formulario disefie as opciones de mantenimiento como grabar (para un nuevo registro de producto generando el cédigo de forma correlativa), buscar (que permite buscar un determinado producto), modificar (que permite modificar el nombre y los datos del producto} yeliminar (que de acuerdo a un determinado objeto deberd eliminar un registro de producto del ArrayList) Use el siguiente disefio de interfaz: bingenerar TbiCodigo ‘ptDescripcion| + =| == ‘btnGrabar cs a btnModificar ‘txtPrecio [+ Ee btntister a ae] btnEliminar wxtstock |-+ [cvocata aad btnBuscar btnGrabarM Productos ira 10.5 Interfaz del mantenimiento de productos. Soluciér 1. Cree un nuevo proyecto en NetBeans llamado pjMantenimientoProductos. 2 Agregue el paquete pFormularios al proyecto pjArrayList. 3. Agregue el paquete pClases al proyecto pjArrayList. 4. Agregue el paquete pimagenes al proyecto. 5. Agregue la clase Producto al paquete pClases.Capitulo 10: Vector de objetos y ArrayList [Tar 6. Agregue la clase ArregloProductos al paquete pClases. 7. Agregue la clase JFrameForm y liémelo frmProducto dentro del paquete pFormularios 8. Asigne un nombre a cada uno de los controles como se muestra en la figura 10.5; para ello, hhaga clic derecho sobre el objeto y seleccione Change Variable Name... 9. Alfinalizar el proyecto, aseguirese de que el explorador de proyectos se muestre como la figura 10.6 Figura 10.6 Explorador de proyectos. 10, Asigne Null Layout al setLayout del Frame haciendo clic derecho sobre el Frame. 11, Seleccione el formulario y en la propiedad Form Size Police modifique el valor encontrado por Generate Resize Code. El siguiente script muestra el contenido de la clase Producto: package Clases; public class Producto { private int coc go; rivate String descripcion; private double precio; private String categoria; private int stock; public Producto(int codigo, String descripcion, double precio, String categoria, int stock) { this.codigo - codigo; this.descripcion - descripcion; this precio - precio; this.categoria ~ categoria; this. stock ~ stock;Manuel Torres Remon public int getCodigo() { return codigo; y public void setCodigo(int codigo) { ‘this.codigo - codigo; } public String getDescripcion() { return descr ipcion; 3 public void setDescr ipcion(String descr ipcion) { ‘this.descripcion ~ descripcion; 3 public double getPrecio() return precio; 3 public void setPrecio(double precio) { this.precio ~ precio; : public String gerCaregoria() [ return categor3; 3 public void setCategoria(String categoria) { ‘this.categoria ~ categoria; } public int getStock() £ return stock; } public void setStock(imt stock) { ‘this stack ~ stock; 3 El siguiente script muestra el contenido de la clase ArregloProductos. package pClases; ‘import java.utit.Arraylist; public class ArrogloProductos { public interface Operaciont ‘int determinar(); 3 ArrayList prods public ArregloProductos(){ prod - new ArrayList (); }Capitulo 10: Vector de objetos y ArrayList public Operacion totalProductos-()-> prod.size() public void agregaProducto(Producto objP){ prod.add (obj) 3 public Producto obtener (int pos) { 5 FaRHFM prod ges (P08); public Producto buscarProducto(int cod) { for (Producto p:prod){ 4f (p.getCodigo()~-cod) return 9; 3 return null; 3 public void eliminaProducto(Producto objP)< prod.remove(objP) ; 3 El siguiente script muestra el contenido del formulario frmProducto: package pFormularios; mport javax.swing.J0ption?ane; Amport pClases.ArregloProductos; import pClases Producto; public class frnProducto extends javax.swing-2Frane { ArregloProductos aProductos ~ mew ArregloProductos() ; fint 1; public frnProducto() ‘initComponents() 5 btnGrabarl. setvisible(false) ; cbocategoria.addItem( "Bebidas " cboCategoria.additem( *Lacteos"); cboCategoria.addItem( ‘Abarrotes * cboCategoria.addTtem( 'Golosinas "); void generaCodigo() { Licodigo.setText(** + n); +BEM. desaroto ce aplicaciones con ava 8) Manuel Tores Remon private void btrGrabarAActionPerforned(java.awt.event .Actionévent evt) { try ( nt codigo ~ Integer. parseTnt(LbiCod igo. getText()); String descripcion ~ txtDescripcion.getText(); String categoria ~ String. valueOf (choCategor ia.getSelectedI tem()) ; double precio ~ Double. parsedouble(txtPrecio. getText()) ; Ant stock ~ Integer. parseInt(txtStock.getText()) ; Producto objP ~ new Producto(cédigo, descripcion, precio, categoria, stock); aProductos .agregaProducto(objP) ; Listards } eatch (Exception ex) ‘OptionPane.showHessageDialog(mUl, ‘Ocurrié un error al intentar agregar’, ‘Confirmacién', Opt ionPane. INFORMATTON_MESSAGE) ; 3 Linpiarcajas(); y private void btnoditicarActionPer formed( java.at.event.Actiontvent evt) { int cod ~ Integer.parseInt (JOptionPane. showInputDialog(nutt, “Ingrese codigo de producto: ")); Producto objP - aProductos.buscarProducto(cod) ; 4 (objP i> mut) [ Lplcodigo.setText('* + objP.getCodigo()); txtdescripcion.setText('" + 0bj>.getDescripcion()); txtPrecio.setText('* + objP.getPrecio()); cboCategoria.setSelectedItem('* + objP.getCategoria()); txtStock.setText(*" + objP.getStock()); btnlodificar setvisible(false) ; btnGrabarM,setVisible (true) ; 3 private void btnGrabaractionPer formed(java.awt.event.Actionvent evt) { try ( Producto pro ~ aProductos..buscarProducto (Integer. parseInt(LblCodigo..getText())) 5 pro.setDescripcion(txtDescripcion.getText()) 5 pro.setPrecio(Double. parseDouble(txtPrecio.getText())); pro. setStock Integer .parselnt(txtStock.getText ())) 5 pro. setCategor ia (String. valueOf (cboCategor ia.getSetectedI tem())) ; SoptionPane.showtessageDialog(wull, "Producto modificada correctanente', 'Confirmacion'*, ‘JOptionPane. INFORMATION MESSAGE) ;5 Capitulo 10: Vector de objetos y ArrayList Vistar; } eatch (Exception ex) { JOptionPane.showlessageDialog(mitt, ‘Ocurri6 un error al ‘ntentar modificar’, 'Confirmacién*, Opt ionPane. INFORMATION. MESSAGE) ; btnGrabarl. setVisible(false) ; bniodilicar.setvisibLe(erue) ; Vinpiarcajas( 5 ) private vaid binFininarAct ionPer formed (java.at event ActionFvent evt) { Vimpiatabla(); ‘int cod ~ Integer parseTnt GOptonPane. showinputDiatog matt, “ngrese codigo de producto: ")); Producto objP ~ Productos. buscorPredieteod)s 4 (objP I= mat) ‘aProductos .eLiminaProducto (obj?) ; JoptionPane.showlessageDialog(mutt, ‘Producto eliminado correctanente", ‘Confirmacion', 3OptionPane. INFORKATION MESSAGE) ; Lister; } ) private void btnl istarActionPerformed(java.aut.event.ActionEvent evt) { ViapiaTablac) ; Vinpiarcajas(); Listar()3 ) private vold benBuscarActionPer formed(java.awe.event.ActionEvent eve) { ‘int cod ~ Integer parsetint GoptionPane. showInputDiatog matt, NIngrese codigo de producto: "))s Linpiatabla(); Producto objP ~ aProductos.buscarProducto(cod) ; Gf (obj? [= mut) { ‘tProductos. setValueAt (objP.getCodigo(), @, 6); tProductos.setValueat (objP.getDescripcion(), 8, 1); tProductos.setValueAt (objP-getPrecio(), @, 2)3 ‘tProductos. setValuedt (objP.getCategoria(), 0, 3); tProductos. setValueAt (ob}P.getStock(), 8, 4); Lcodigo.setText('* + objP.getCodigo()); txtDescripcion.setText(** + objP.getDescripeion() ); txtPrecio.setText('" + objP.getPrecio()); cboCategoria.setSelectedItem( '" + objP.getCategoria()); txtStock.setText(*! + objP.getStock());Manuel Torres Remon private void btnGenerarActionPer formed(java.awt event Actionévent evt) { Limpiarcajas(); generacodigo() ; 3 void Listar() { for (int i ~ 0; 1 < aProductos.totalProductos.determinar(); i+) { Producto objP ~ aProductos.obtener (i); tProductos.setValueat (objP.getCodigo(), 7, 0)5 tProductos.setValueat (objP.getDescripcion(), i, 1); ‘Productos. setValueAt (objP.getPrecio(), 7, 2)5 tProductos.setValueat (objP.getCategoria(), 1, 3); tProductos.setValueAt (objP.getStock(), 1, 4); void linpiatabla) { for (int 1-6; 4 < 2; 444) ¢ tProductos.setvalueat(*', 3, tProductos.setValueat('', 3, tProductos.setValueAt('', 4, tProductos.setValueat(*', 4, Productos. setValueAt( 4) void Limpiarcajas() { UiCodigo. setText(""); txtDescripcion.setText(* txtPrecio.setText('"); txtStock.setText(*"); cboCategoria.setSelectedIndex(-1) ;Archivos de texto m Reconoce el trabajo de los archivos de texto. '& Implementa una aplicacién de mantenimiento con datos registrados en un archivo de texto. 4.1 Configuracién del JDK 11.2 Librerias a utilizar para el manejo de archivos 11.3 Clases y métodos para el manejo y control de archivos de texto > Caso desarrollado 1: Mantenimiento de estudiantes > Caso desarrollado 2: Mantenimiento de productosCapitulo 11: Archivos de texto i) 11.1 Configuraci6n del JDK ELJDK deberé estar preparado para manipular archivos de texto, es decir, para habilitar la escritura, la sobreescritura y la eliminacién, En el caso de NetBeans, este tiene habilitado todos estos servicios, pero, igualmente, es necesario conacer cémo deberén ser habilitados estos servicios en otros IDE. ‘A continuacién se muestran los pasos para configurar la manipulacién de archivos desde el JDK. Pasos para configurar el JDK: 1. Dirfjase a C:\Program Files\Java\jdk1.7.0_5\bin La imagen anterior muestra los archivos que contiene la carpeta bin del JDK de Java. 2. Seleccione y ejecute el archivo policytool; tenga en cuenta que, si usted se encuentra en Windows 7 u otro sistema operativo superior, tendré que ejecutar el archivo en modo Administrador; para ello deberd hacer clic derecho sobre el archivo policytool y seleccionar Ejecutar como Administrador.Manuel Torres Remon 3. Seleccione Archivo > Abrir de la ventana Herramienta de Politicas. Busque y ejecute el archivo java.policy en la siguiente ruta: Si cuenta con una versién distinta de JDK, no debe preocuparse, puesto que la ruta que se indica es la misma en todas las versiones.Capitulo 11: Archivos de texto [Tar Una vez abierto el archivo java. policy, se muestra la siguiente ventana: 4, Seleccione CodeBase , luego haga clic en Editar entrada de Politica. 5. Seleccione Agregar Permiso de la ventana Entrada de Politica.Manuel Torres Remon 6. Seleccione: 2) Permiso FilePermission ») Nombre de destina : < > ©) Acciones :read, write, delete, execute (en este caso tendré que seleccionar las 4 acciones) ro ll soon] 7 Seleccione Aceptar> 8, Seleccione Archivo > Guardar. 8. Para constatar que todos los cambios han sido registrados de forma correcta, debera aparecer el siguiente mensaje: 11.2 Librerias a utilizar para el manejo de archivos Frecuentemente los programas necesitan traer informacion desde una fuente externa o enviar informacion a una fuente externa. La informacién puede estar en cualquier parte: en un fichero, en un disco, en algtin lugar de la red, en la memoria o en otro programa. También puede ser de cualquier tipo: abjetos, caracteres, imagenes 0 sonidos. Para traer la informacién, un programa abre un stream sobre una fuente de informacién (un fichero, memoria, un socket) y lee la informacién serialmente de esta forma: Astream Similarmente, un programa puede enviar informacién a un destino externo abriendo un stream sobre un destino y escribiendo la informacién serialmente de esta forma: Astream writesManuel Torres Remon 6. Seleccione: 2) Permiso FilePermission ») Nombre de destina : < > ©) Acciones :read, write, delete, execute (en este caso tendré que seleccionar las 4 acciones) ro ll soon] 7 Seleccione Aceptar> 8, Seleccione Archivo > Guardar. 8. Para constatar que todos los cambios han sido registrados de forma correcta, debera aparecer el siguiente mensaje: 11.2 Librerias a utilizar para el manejo de archivos Frecuentemente los programas necesitan traer informacion desde una fuente externa o enviar informacion a una fuente externa. La informacién puede estar en cualquier parte: en un fichero, en un disco, en algtin lugar de la red, en la memoria o en otro programa. También puede ser de cualquier tipo: abjetos, caracteres, imagenes 0 sonidos. Para traer la informacién, un programa abre un stream sobre una fuente de informacién (un fichero, memoria, un socket) y lee la informacién serialmente de esta forma: Astream Similarmente, un programa puede enviar informacién a un destino externo abriendo un stream sobre un destino y escribiendo la informacién serialmente de esta forma: Astream writesCapitulo 11: Archivos de texto [ae El paquete java.io contiene una coleccién de clases stream que soportan estos algoritmos para leer y escribir. Estas clases estén divididas en dos rboles, baséndose en los tipos de datos (carac- teres o bytes) sobre los que opera. Sin embargo, algunas veces es mas conveniente agrupar las clases basdndose en su propésito en vez que en los tipos de datos que lee o escribe. Asi, podemos agrupar los streams dependiendo de sileen o escriben lados en las "profundidades" o procesan la informacién que esta siendo lefda oescrita 11.3 Clases y métodos para el manejo y control de archivos de texto BufferedReader LineNumberReader CharArrayReader InputStreamReader FileReader FilterReader PushBackReader PipedReader StringReader Bufferedwriter CharArrayWriter ‘OutputStreamReader FileWriter Fee PipedWriter | StringWriter Filterwritera | Manuel Torres Remon pre Laclase BufferedReader deriva dela clase Reader. Esta case ahadeun buffer para ealizarunalectura eficiente de caracteres Dispone delmétodoreadLine que permite leer una linea de texto y devolverla como String. Peper ney ut br fete ore anes eee nto br-new BufferedReader (new FileReader (archivotexto)); Geass « G )) eg Esta clase tiene métodos que nos permiten leer caracteres. Sin embargo, suele ser habitual querer las lineas completas, bien porque nos interesa la linea completa, bien para poder analizarialuegoy extraer campos deella, FileReader no contiene métodos que nos permitan leer lineas completas, perosi BufferedReader. ORCI EEEM File archivo ~ new File ('C:\archivo.txt'); POIROT Fi leReader fr - new FileReader (archivo); BufferedReader br ~ new BufferedReader (fr) ; Creer ‘= Una ver abierto el archivo, br apunta ala primera cadena de bits. = Elmétodo readLine() asociado a brcaptura una cadena debits ysalta 2 la siguiente linea debits, Dicha cadena es convertida seguidamente al tipo dedatos requerido por la aplicacion, ‘= Cuando no existe mas cadena que mostrar, br apunta anull ‘= Elmétodo close() cierrael acceso al archivo. BuffereReader br=new BufferedReader new FileReader(archivo) Panne Esla clase que permite escribir los datos de la memoria hacia un archivo de texto (output). Lo primero que tenemos que hacer es crear una variable de tipo Printwriter, Perera tipo PrintWriter Prinewriter pw; ieereeren crt sy nae Pw ~ new Printhiriter (new Fileviriter (archivo); Esta clase se encarga de abrir el archivo en modo de escritura, Es decir, sel archivo contiene informacién, esta se pierde. Sil archivo no existe, lo crea. Creer ‘= Una ver abierto el archivo, pw apunta al inicio ‘= Elmétodo printin(data) asociaco a pw graba como cadena de bits la data indicada y genera un salto de linea en el archivo, = Elmétodo close() cierrael acceso al archivo. Printiriter pw ~ new Printwriter(new Filewriter (archivo);Capitulo 11: Archivos de texto |e CASO DESARROLLADO 1: Mantenimiento de alumnos Implemente una aplicacién que permita realizar el mantenimiento de los registros de un estudiante, en la cual se ingresard un cédigo, nombres, ciclo y pensién. Consideracione: m Debe crear tres clases: » Clase Estudiante, que permitira definir los atributos del estudiante, como su cédigo, nombres, ciclo de estudio y el monto de la pensi6n. > Clase ArregloEstudiantes, que permitiré almacenar a los registros del estudiante en un vector de objetos. » Clase frmMantenimiento, que permitird interactuar con el usuario para el control de los registros del estudiante. = Debe crear siete botones: » Botén Ingresar. Tiene por objetivo habilitar las cajas de texto para un nuevo registro de estudiante; ademas, genera un codigo al estudiante de forma automatica > Botén Consultar. Tiene por objetivo solicitar un cédigo de estudiante y mostrar los datos del estudiante para buscarlo en el vector. En caso no lo encuentre, muestra un mensaje de error. » Botén Modificar. Tiene por objetivo solicitar un cédigo de estudiante para buscarlo en el vector y mostrar sus datos en los controles JTextField. Al modificar se habilitard el botén grabar. » Botén Eliminar. Tiene por objetivo solicitar un cédigo de estudiante para eliminarlo del vector de estudiantes. » Botén Listar. Permite listar los registros contenido en el vector de estudiantes. » Botén Grabarl. Permite grabar los valores del estudiante que se ingresan por primera vez. > Botén GrabarM. Permite grabar las modificaciones realizadas sobre un registro de estudiante. m= Use la siguiente interfaz grafica: ‘icodigo —— enemies [Fe Mamet ames lf Biningresar om ee coonsa_«+-{ btnConsultar coocico | | Rm) —_ a CI tatPension [Tam moeemni ae |e PD retninae I Sa bintistar Keene] btnGrabart wWiurinos [oe LU binérabartt ra 11.1 Formulario de mantenimiento de alumnos.Manuel Torres Remon Soluci6n: 1. Cree un nuevo proyecto en NetBeans llamado pjinstituto, 2, Agregue el paquete pFormularios al proyecto pjinstituto. 3, Agregue el paquete pClases al proyecto pjinstituto. 4, Agregue la clase Estudiante al paquete pClases. 5. Agregue la clase ArregloEstudiantes al paquete pClases 6. Agregue la clase frmMantenimiento al paquete pFormularios. 7. Asigne un nombre a cada uno de los controles como se muestra en la figura 11.1; para ello, hhaga clic derecho sobre el objeto y seleccione Change Variable Name... 8, Después de asignar nombres a los objetos, asegurese de que los controles sean los correctos; para ello, visualice el panel Navigator, el cual debe mostrarse como la figura 11.2. Figura 11.2 listado de controles desde la ventana Navigator.Capitulo 11: Archivos de texto [a7 8. Asigne Null Layout al setLayout del Frame haciendo clic derecho sobre el Frame, 10, Seleccione el formulario y en la propiedad Form Size Police modifique el valor encontrado por Generate Resize Code. El siguiente script muestra el contenido de la clase Estudiante: package Clases; public class Cstudiante { private int codigo,ciclo; private String nombre; private double pension; public Estudiante(int codigo, Str 3 1g ponbre, int ciclo,double pens én) { ‘this .codigo-céd igo; this nonbre-nonbre; this.ciclo-ciclo; this. pension-pension; public int getCodigo(){ return codigo; } public String getNonbre() ( } return nombre; public int getCiclo(){ return ciclo; } public double getPension() { return pension; } public void setCodigo(int codigo) { 3 ‘this .codigo-codigo; public void sethonbre(String nombre) ( } ‘this .nombre-nonbre; public void setCiclo(int ciclo) { 3 this.ciclo-ciclo; public void setPension(double pension) { 3 ‘this. pens ion-pension; El siguiente script muestra el contenido de la clase ArregloEstudiantes: package Clases; ‘import ‘import ‘import ‘import ‘import ‘import ‘import import java.io. BufferedReader; java.io. File; Java. io. FileReader} java.io. Filewriter; Java. io.Printariters Javacutil.Arraylist; Java.util.StringTokenizer; Javax. swing. JOptionPanes368 Se Manuel Torres Remon public class Arroglofstudiantes { private ArrayList a€st; public Arrogloestudiantes(){ aéstnew Arraylist () ; cargar(); 3 public void adicionar (Estudiante e){ atst.add(e); } public Estudiante obtener (int pos) { return aEst.get (pos) ; } public Estudiante buscar (int cod) { for(int i-0;i 0){ for(int i-0; i aProductos; public ArregloProductos() { aProductos ~ new ArrayList (); cargar()3 > void cargar() [ try File archivo - new File( ‘productos. txt"); Gf (archivo.exists()) { BufferedReader br ~ new BufferedReader ( new FileReader ( ‘productos. txt")); String Lincs: while ((Linea ~ br.readLine()) !- mutt) £ StringTokenizer st ~ new StringTokenizer(Linea, ',"); String codigo ~ st.nextToken().trim(); String descripcion ~ st.nextToken().trim(); ‘String categoria - st.nextToken().trim(); nt stock ~ Integer.parseInt(st.nextToken() .trim()); double precio-Double. parseDouble(st.nextToken() .trim()) 3 Producto p - new Producto(cédigo, descripcion, categoria, stock, precio); adicionar(p); + br closet); + } eatch (Exception ex) ‘OptionPane. shonMessageDialog(nUl, ‘No hay nada que mostrar"); 3 3 public void grabar() { try PrintWriter pw-new PrintWriter (new Fileliriter (tproductos. txt); for (int i - 0; 4 < getTamafio(); is+) { pw.printIn(obtener (i) .getCodigo() + '," + obtener (i). getDescripcion() + '," + obtener (i) .getCategoria() + 1," + obtener(i).getStock() +',* + obtener (1) .getPrecio()); pw.close(); SoptionPane.showMessageDialog(muUl, 'Grabacién correcta");378 7 Manuel Torres Remon El siguiente script muestra el contenido de la clase ArregloProductos: package pCLase=; import java. io.BufferedReader; import jov.10-F le; import java.io. lekeaders Amport java. io.Filewriter; 4mport java.io. Printwriter; import java.util.ArrayList; Gmport java.util. StringTokenizers Amport javax. swing. J0ptionPane; public class ArregloProductos ( private Arraylist aProductos; public ArregloProductos() { aProductos ~ new ArrayList (); cargar()3 > void cargar() [ try File archivo - new File( ‘productos. txt"); Gf (archivo.exists()) { BufferedReader br ~ new BufferedReader ( new FileReader ( ‘productos. txt")); String Lincs: while ((Linea ~ br.readLine()) !- mutt) £ StringTokenizer st ~ new StringTokenizer(Linea, ',"); String codigo ~ st.nextToken().trim(); String descripcion ~ st.nextToken().trim(); ‘String categoria - st.nextToken().trim(); nt stock ~ Integer.parseInt(st.nextToken() .trim()); double precio-Double. parseDouble(st.nextToken() .trim()) 3 Producto p - new Producto(cédigo, descripcion, categoria, stock, precio); adicionar(p); + br closet); + } eatch (Exception ex) ‘OptionPane. shonMessageDialog(nUl, ‘No hay nada que mostrar"); 3 3 public void grabar() { try PrintWriter pw-new PrintWriter (new Fileliriter (tproductos. txt); for (int i - 0; 4 < getTamafio(); is+) { pw.printIn(obtener (i) .getCodigo() + '," + obtener (i). getDescripcion() + '," + obtener (i) .getCategoria() + 1," + obtener(i).getStock() +',* + obtener (1) .getPrecio()); pw.close(); SoptionPane.showMessageDialog(muUl, 'Grabacién correcta");Capitulo 1: Archivos de texto } eateh (Exception ex) £ } 3 public void adicionar (Producto p) { aProductos.add(p) ; } public Producto obtener (mt pos) { Feturn aProductos.get(pos) 5 + public Producto buscar(String codigo) { for (int i - 9; 1 < aProductos.size(); it+) { 4# (codigo.equals(aProductos.get(1).getCodigo())) { return 2Productos.get (+ + i return null; 3 public int gecramano() { return aProductos.size(); ¥ public void elininar(Producto p) { aProductos. remove(p) 5 } El siguiente script muestra el contenido de la clase frmListadoProductos: package pFormi Larios; ‘import pClases.ArregloProductos; Amport pClases Producto; public class frnlistadoProductos extends javax.swing.JInternalFrane { ‘ArregloProductos a ~new ArregloProductos() ; public frnlistadoProductos() { ‘initComponents() 5 LstarProductos(); } void ListarProductos(){ for(int 4-0;i You might also like
Manual Python DataScienceDocument89 pagesManual Python DataScienceTaipe Lopez Andy100% (5) Creando Arboles Fractales Con Turtle en PDFDocument14 pagesCreando Arboles Fractales Con Turtle en PDFTaipe Lopez AndyNo ratings yet MetáforaDocument63 pagesMetáforaTaipe Lopez AndyNo ratings yet Introduccion ReniecDocument3 pagesIntroduccion ReniecTaipe Lopez AndyNo ratings yet Avoiding Man in The Middle Attack Based On ARP Spoofing in The LANDocument4 pagesAvoiding Man in The Middle Attack Based On ARP Spoofing in The LANTaipe Lopez AndyNo ratings yet Using Parallel Computing To Implement Se PDFDocument4 pagesUsing Parallel Computing To Implement Se PDFTaipe Lopez AndyNo ratings yet Continuous Arabic Sign Language Recognition in User Dependent ModeDocument9 pagesContinuous Arabic Sign Language Recognition in User Dependent ModeTaipe Lopez AndyNo ratings yet Plan Estrategico Tecnologia Informacion BCRP 2017 2021 PDFDocument26 pagesPlan Estrategico Tecnologia Informacion BCRP 2017 2021 PDFTaipe Lopez AndyNo ratings yet Hidden Figures: The American Dream and the Untold Story of the Black Women Mathematicians Who Helped Win the Space RaceFrom EverandHidden Figures: The American Dream and the Untold Story of the Black Women Mathematicians Who Helped Win the Space RaceRating: 4 out of 5 stars4/5 (895) The Subtle Art of Not Giving a F*ck: A Counterintuitive Approach to Living a Good LifeFrom EverandThe Subtle Art of Not Giving a F*ck: A Counterintuitive Approach to Living a Good LifeRating: 4 out of 5 stars4/5 (5794) Shoe Dog: A Memoir by the Creator of NikeFrom EverandShoe Dog: A Memoir by the Creator of NikeRating: 4.5 out of 5 stars4.5/5 (537) Grit: The Power of Passion and PerseveranceFrom EverandGrit: The Power of Passion and PerseveranceRating: 4 out of 5 stars4/5 (588) The Yellow House: A Memoir (2019 National Book Award Winner)From EverandThe Yellow House: A Memoir (2019 National Book Award Winner)Rating: 4 out of 5 stars4/5 (98) The Little Book of Hygge: Danish Secrets to Happy LivingFrom EverandThe Little Book of Hygge: Danish Secrets to Happy LivingRating: 3.5 out of 5 stars3.5/5 (400) Never Split the Difference: Negotiating As If Your Life Depended On ItFrom EverandNever Split the Difference: Negotiating As If Your Life Depended On ItRating: 4.5 out of 5 stars4.5/5 (838) Elon Musk: Tesla, SpaceX, and the Quest for a Fantastic FutureFrom EverandElon Musk: Tesla, SpaceX, and the Quest for a Fantastic FutureRating: 4.5 out of 5 stars4.5/5 (474) A Heartbreaking Work Of Staggering Genius: A Memoir Based on a True StoryFrom EverandA Heartbreaking Work Of Staggering Genius: A Memoir Based on a True StoryRating: 3.5 out of 5 stars3.5/5 (231) The Emperor of All Maladies: A Biography of CancerFrom EverandThe Emperor of All Maladies: A Biography of CancerRating: 4.5 out of 5 stars4.5/5 (271) Devil in the Grove: Thurgood Marshall, the Groveland Boys, and the Dawn of a New AmericaFrom EverandDevil in the Grove: Thurgood Marshall, the Groveland Boys, and the Dawn of a New AmericaRating: 4.5 out of 5 stars4.5/5 (266) The Hard Thing About Hard Things: Building a Business When There Are No Easy AnswersFrom EverandThe Hard Thing About Hard Things: Building a Business When There Are No Easy AnswersRating: 4.5 out of 5 stars4.5/5 (345) On Fire: The (Burning) Case for a Green New DealFrom EverandOn Fire: The (Burning) Case for a Green New DealRating: 4 out of 5 stars4/5 (74) The World Is Flat 3.0: A Brief History of the Twenty-first CenturyFrom EverandThe World Is Flat 3.0: A Brief History of the Twenty-first CenturyRating: 3.5 out of 5 stars3.5/5 (2259) Team of Rivals: The Political Genius of Abraham LincolnFrom EverandTeam of Rivals: The Political Genius of Abraham LincolnRating: 4.5 out of 5 stars4.5/5 (234) The Unwinding: An Inner History of the New AmericaFrom EverandThe Unwinding: An Inner History of the New AmericaRating: 4 out of 5 stars4/5 (45) The Gifts of Imperfection: Let Go of Who You Think You're Supposed to Be and Embrace Who You AreFrom EverandThe Gifts of Imperfection: Let Go of Who You Think You're Supposed to Be and Embrace Who You AreRating: 4 out of 5 stars4/5 (1090) The Sympathizer: A Novel (Pulitzer Prize for Fiction)From EverandThe Sympathizer: A Novel (Pulitzer Prize for Fiction)Rating: 4.5 out of 5 stars4.5/5 (121) Her Body and Other Parties: StoriesFrom EverandHer Body and Other Parties: StoriesRating: 4 out of 5 stars4/5 (821)