Académique Documents
Professionnel Documents
Culture Documents
Tema3:Programacinen entornosgrficosdeusuario
1.Introduccin 2.Evolucinhistrica 3.Caractersticasdela programacinenGUIs 4.Gestindeeventos 5.Arquitecturadeunaaplicacin conGUI 7.ProgramacindeGUIsenJava 8.ComponentesSwing 9.PrimerospasosenSwing 10.Gestoresdededistribucin 11.DiseandonuestroJFrame 12.Capturadeeventos 12.Cuadrosdedilogo 13.Teclasrpidas 14.LoslooksdeSwing
Programacinen GUIs
Introduccin
EntendemosporInterfazGrficadeUsuario(GUI)al softwarequepermitelainteraccinentreelusuarioy losserviciosqueproporcionaelsistemaoperativo, utilizandoparaellounarepresentacingrficaintuitiva dealtonivel Lainformticamodernanopuedeentendersesinel impactoquesupusolageneralizacindelosentornos grficosdeusuarioapartirdelos80 Hoyenda,lamayorpartedelasaplicaciones destinadasausuariosfinalesserealizanparaestetipo deentornos
Introduccin
Programacinen GUIs
LamayoradelosGUIsdepropsitogeneralsiguen lallamadametforadeescritorio,yutilizanunsistema deventanas.Paralainteraccinconelusuario disponendeunnmeromsomenosgrandede elementosowidgets:botones,editores,etc. Novamosaestudiaraqulascaractersticasdelas interfacesdeusuario,sudiseooimplementacin (asignaturaInterfazPersonaOrdenador) Noscentraremosenlascaractersticasdela programacinenestetipodeentornosyenuna descripcingeneraldelcambioquesuponerespectoa laprogramacinclsicaylasnuevasposibilidadesque aporta
Introduccin
Programacinen GUIs
Evolucinhistrica
LaaparicindelosGUIsfueposibleporlamejorade lasprestacionesdelosordenadores.Laescasa potenciadelosordenadoreshastaprincipiosdelos70 hacaimpensabledesperdiciarCPUenlainterfazcon elusuario Hastaentonceselusuariodisponadeunamnima interfazenmodotexto,bsicamenteunalneadonde setecleabanloscomandosdelS.O.,enunnivelmuy cercanoalamquina
Evolucinhistrica
Programacinen GUIs
Losorgenes
Alto(1973).DesarrolladoenelXeroxPARC,Altofue elprimerordenadorqueincorporabaratnyun sistemaoperativoconunainterfazgrficadeusuario. Sinembargosuprecioeraprohibitivo,loqueimpidi sudifusinfueradelmbitodeuniversidadesy centrosdeinvestigacin
Programacinen GUIs
LosentornosoperativosdeAppleyNext
System1(1984).SteveJobstomolas ideasdesarrolladasenelXeroxPARCpara disearelsistemaoperativodelnuevo ordenadorqueibaalanzaralmercadosu compaaApple,elMacintosh.Este ordenadoracerclainformticaalusuario domsticocomonuncaanteshabaocurrido GS/OS(1988).ElSystem1 evolucionrpidamentehastael GS/OS,queincorporabaexplotabael soportedecolor(200x320x16colores) ysonidodelAppleIIGS,ascomosu mayorpotencia.Losordenadores Applesehicieronpopularesporlo sencilloeintuitivoqueerasuuso
Evolucinhistrica
Programacinen GUIs
Evolucinhistrica
Programacinen GUIs
XWindow
ElsistemaXWindowfuedesarrolladoenelMITen1984,apareciendola primeraversincomercialen1986.XWindownoeraunGUIens,sino simplementeunsistemadeventanasconcapacidaddefuncionaratravsde lared.ParatrabajarconXWindoweranecesarioungestordeventanas,que eraelqueproporcionabaellookandfeeldefinitivo
Evolucinhistrica
Programacinen GUIs
Programacinen GUIs
Programacinen GUIs
WindowsyOS/2
Windows1.0(1985).Fueunintento deMicrosoftparaimplantarlafilosofa delosGUIsdeAppleenlaplataforma PC.Elresultadoerarealmente bastantepobre.Surepercusinfue francamenteescasa
Evolucinhistrica
Programacinen GUIs
Evolucinhistrica
Programacinen GUIs
CaractersticasdelaprogramacinenGUIs
LaprogramacinenunGUIdeterminadorequiereel usodeuntoolkit(oSDK)paraeseGUI,enellenguaje deprogramacinquequeramosutilizar
ExistesiempreuntoolkitoficialqueproporcionaelfabricantedelGUI, normalmenteparaCoC++.PorejemploMFCparaprogramacinenWindows Tambinexistentoolkitsalternativosdesarrolladosporterceros,yasean comercialesogratuitos.Porejemplo,OWL(C++)deBorlandparaWindows Finalmentetambinesposibleelusodeuntoolkitmultiplataforma,comoGTK+ (paraC),QtoFltk(ambosparaC++)
Programacinen GUIs
Caractersticasdela programacinenGUIs
Programacinen GUIs
Algunoseventosnorelacionadosdirectamenteconel usuarioson:
Aparicindeunaventana Tickdeunrelojprogramadoconantelacin
Caractersticasdela programacinenGUIs
Programacinen GUIs
Manejador 4
Caractersticasdela programacinenGUIs
Programacinen GUIs
Programacinen GUIs
Caractersticasdela programacinenGUIs
Programacinen GUIs
Unavezrealizadoeldiseo,losentornosdedesarrollo eligenunadelassiguientesestrategias:
Salvareldiseoylaspropiedadesenficherosocultosespecialesqueson compiladosjuntoalcdigo(Delphi,C++Builder,VisualBasic) Generarelcdigocorrespondientedelainterfazqueeldesarrolladorcompletacon supropiocdigo(NetBeans)
Caractersticasdela programacinenGUIs
Programacinen GUIs
Gestindeeventos
Comoacabamosdever,enunprogramaparaunGUI latareafundamentalarealizaresgestionaradecuada menteloseventosrecibidos Lainformacinasociadaauneventosuelesercomo mnimouncampoindicadordeltipodeeventoyel identificadordelelementoquegeneradichoevento (botn,ventana,etc.) Unaspectofundamentaleneldiseodeuntoolkites laformaenqueseproducelaconexinentreelgestor deeventosylosmanejadores
Gestindeeventos
Programacinen GUIs
Programacinen GUIs
Gestindeeventos
Programacinen GUIs
Gestindeeventos
Programacinen GUIs
Gestindeeventos
Programacinen GUIs
ArquitecturadeunaaplicacinconGUI
LaarquitecturadeunaaplicacinconGUItieneuna seriedenivelesqueenglobanclasesquerealizan distintastareas
Capadepresentacinointerfaz Capadeaplicacinodeldominiodelproblema Capadepersistencia
Capa de presentacin
Capa de aplicacin
Capa de persistencia
Arquitecturadeuna aplicacinGUI
Programacinen GUIs
Lacapadepresentacinointerfazcontienelosobjetos quepermitenmostrarlainformacinalusuarioy gestionarlainteraccinconelmismo.Atencin:es dependientedeltoolkitutilizado Lacapadeaplicacinodedominiodelproblema contienelasobjetosquemodelanlasolucindel problema(objetosdenegocio).Eslacapams importanteypuedeserreutilizadatotaloparcialmente enmltiplesaplicacionessimilares Lacapadepersistenciacontieneelcdigonecesario paraalmacenarlosobjetosdenegocioenbasesde datosoficheros.Puedeserdependientedelabasede datos/formatodeficheroutilizado
Arquitecturadeuna aplicacinGUI
Programacinen GUIs
Programacinen GUIs
ProgramacindeGUIsenJava
PuestoqueJavapretendeserunlenguajemultipla taforma,eldiseodeltoolkitparaprogramacindeGUIs sehizopensandoenquelasaplicacionestuvieranun buenaspectoencualquierplataformaperoindepen dientedecualquierGUIespecfico EstetoolkitsedenominAWT1.0(AbstractWindow Toolkit)
Programacin deGUIsenJava
Programacinen GUIs
Programacin deGUIsenJava
Programacinen GUIs
AspectoSwingpordefecto
AspectoWindows
AspectoMotif
Programacin deGUIsenJava
Programacinen GUIs
ComponentesdeSwing
Componentescontenedores(sirvenparacontenery organizarotroscompontes):
JFrame.Representaunaventanabsica,capazde contenerotroscomponentes.Casitodaslas aplicacionesconstruyenalmenosunJFrame JDialog,JOptionPane,etc.Loscuadrosdedilogo sonJFramerestringidos,dependientesdeun JFrameprincipal.LosJOptionPanesoncuadrosde dilogosencillospredefinidosparapedir confirmacin,realizaradvertenciasonotificarerrores. LosJDialogsoncuadrosdedilogogenerales, normalmenteutilizadosparapeticionesdedatos
Componentesde Swing
Programacinen GUIs
Componentesde Swing
Programacinen GUIs
Componentesde Swing
Programacinen GUIs
Controlesbsicos:
JButton,JCheckBox,JRadioButton.Distintostiposde botones.Uncheckboxsirveparamarcarunaopcin.Un radiobuttonpermiteseleccionarunaopcinentrevarias disponibles JComboBox.Lascomboboxesolistasdesplegablesque permitenseleccionarunopcinentrevariasposibles
JList.Listasquepermitenseleccionarunooms elementos JTextField,JFormattedTextField,JPasswordField. Distintostiposdeeditores.JFormattedTextFieldpermite indicarelconjuntodecaractereslegalesquepueden introducirse.JPasswordFieldnomuestraelcontenido JSlider.Unsliderpermitenintroducirunvalor numricoentreunmximoyunmnimodemanera rpida Componentesde
Swing
Programacinen GUIs
Mensdesplegables.Existendostiposdemens: JMenuBar,queconsisteenunabarrademens desplegablesenlapartesuperiordelaaplicacin,y JPopupMenu,unmenqueseobtienealpulsarconelbotn derechodelratnsobreunazonadeterminada.Losmens estncompuestospordistintositems:JSeparator(unalnea deseparacinentreopciones),JMenuItem(unaopcin ordinaria),JMenu(unsubmenu),JCheckboxMenuItem(un opcinenformadecheckbox)ofinalmente JRadioButtonMenuItem(unaopcinenformaderadio button
Componentesde Swing
Programacinen GUIs
Controlesespecializados:
JColorChooser.Consisteenunselectordecolores
Programacinen GUIs
Controlesnointeractivos(muestranalgntipode informacinperonointeraccionanconelusuario):
JLabel.Permitesituaruntexto,untextoconunaimageno unaimagennicamenteenlaventana.Nosoniteractivosy puedeutilizarsecdigoHTMLparaescribirtextoenvarias lneasyconvariosatributos JProgressBar.Permitemostrarqueporcentajedeltotalde unatareaarealizarhasidocompletado JToolTip.Consisteenunaetiquetadeayudaquesurgeal cabodeunosegundossobrelaposicinapuntadaporel cursor.Normalmentenoesnecesarioutilizardirectamentela claseJToolTip,sepuedeestablecerparacualquier componentedelaventanamediante:e.setToolTipText(sta eslaetiqueta)
Componentesde Swing
Programacinen GUIs
PrimerospasosenSwing
Casisiempre,elprimerpasoalahoradeconstruiruna aplicacinescrearunJFrameinicial PordefectounJFramesecreadeformainvisible,as quequeesnecesarioactivarsuvisualizacinmediante laoperacinsetVisible()
import javax.swing.JFrame; public class AppHolaMundo { public static void main(String[] args) { JFrame f = new JFrame("Prueba"); f.setVisible(true); } }
Primerospasos enSwing
Programacinen GUIs
Primerospasos enSwing
Programacinen GUIs
Primerospasos enSwing
Programacinen GUIs
Gestoresdedistribucin
Unadelastareasmstediosasalahoradedisearun frameconvarioselementosenelinterioresposicionary establecereltamaodecadaunodeestoselementos. Dosalternativas:
Posicionarcadaunoloselementosindicandoposicionesytamaos.Estediososi noserealizadeformainteractiva.Ademsalcambiareltamaodelframelos elementospuedendesajustarse Utilizarungestordedistribucinqueseencargadedistribuirloscomponentesde formaautomtica.Puedesercomplicadoobtenerladistribucinquerealmente deseamos
Gestoresde distribucin
Programacinen GUIs
EnlaprogramacinconSwingserecomiendaelusode ungestordedistribucin(LayoutManager)parala distribucindeloscomponentesenframesycuadrosde dilogo Podemosestablecerelgestordedistribucinparalos elementossituadosenunpanelmediante panel.setLayout(<gestordedistribucin>) Podemosanularladistribucinautomticamediante panel.setLayout(null)eindicarcoordenadasabsolutas Paraestablecereltamaodelframequecontienelos componentestenemosigualmentedosopciones:
Utilizarframe.pack()paraqueajustesutamaoaldeloscomponentesdesu interior.Estaeslaopcinmsrecomendable Establecersutamaoindicandoanchoyaltomedianteframe.setSize()
Gestoresde distribucin
Programacinen GUIs
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
Programacinen GUIs
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
Gestoresde distribucin
Programacinen GUIs
public class AppBanco { public static void main(String[] args) { JFrame f = new JFrame("Gestin de Cuentas"); f.setLayout( new BoxLayout(f.getContentPane(), BoxLayout.X_AXIS)); f.add(new JLabel("Cdigo")); f.add(new JTextField(8)); f.add(new JLabel("Titular")); f.add(new JTextField(30)); f.add(new JLabel("Saldo")); f.add(new JTextField(8)); f.add(new JLabel("Inters")); f.add(new JTextField(4)); f.pack(); // Ajustar JFrame a los contenidos f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } Gestoresde distribucin
Programacinen GUIs
UtilizandoelparmetroX_AXISoY_AXISconseguimos unadistribucinhorizontalovrtical
Gestoresde distribucin
Programacinen GUIs
ElgestordedistribucinGridLayoutorganizalos componentesenunarejilladeceldasdelmismotamao
public class AppBanco { public static void main(String[] args) { JFrame f = new JFrame("Gestin de Cuentas"); f.setLayout(new GridLayout(4,2)); f.add(new JLabel("Cdigo")); f.add(new JTextField(8)); f.add(new JLabel("Titular")); f.add(new JTextField(30)); f.add(new JLabel("Saldo")); f.add(new JTextField(8)); f.add(new JLabel("Inters")); f.add(new JTextField(4)); f.pack(); // Ajustar Frame a los contenidos f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
Gestoresde distribucin
Programacinen GUIs
ElgestordedistribucinGridBagLayoutesun organizadorbasadotambinenrejillaaunquems flexible,concapacidadparaqueloscomponentes ocupenvariasceldasdedistintotamaosiesnecesario ElgestorSpringLayoutsebasaenlaespecificacinde distanciasentrelosbordesdelosdistintos componentes.Estpensadoparaelusodeuneditor grficointeractivo Tambin,aunqueestdesaconsejado,podemosanular elgestordedistribucinyeindicardirectamente posicionesytamaosparaloscomponentes
Gestoresde distribucin
Programacinen GUIs
staseralaformadeorganizarlaventanaprincipaldenuestroejemplode maneramanual
public class AppBanco { public static void main(String[] args) { JFrame f = new JFrame("Gestin de Cuentas"); JLabel lc, lt; JTextField tfc, tft; f.setLayout(null); f.add(lc = new JLabel("Cdigo")); f.add(tfc = new JTextField(8)); lc.setBounds(10, 10, 50, 20); tfc.setBounds(70, 10, 50, 20); f.add(lt = new JLabel("Titular")); f.add(tft = new JTextField(30)); lt.setLocation(10, 40); lt.setSize(50, 20); tft.setLocation(70, 40); tft.setSize(120, 20); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(320, 200); f.setVisible(true); } }
Gestoresde distribucin
Programacinen GUIs
Gestoresde distribucin
Programacinen GUIs
Gestoresde distribucin
public class AppBanco { public static void main(String[] args) { JFrame f = new JFrame("Gestin de Cuentas"); JPanel pc = new JPanel(); pc.setLayout(new FlowLayout(FlowLayout.LEFT)); pc.add(new JLabel("Cdigo")); pc.add(new JTextField(8)); JPanel pt = new JPanel(); pt.setLayout(new FlowLayout(FlowLayout.LEFT)); pt.add(new JLabel("Titular")); pt.add(new JTextField(30)); JPanel psi = new JPanel(); psi.setLayout (new FlowLayout(FlowLayout.LEFT)); psi.add (new JLabel("Saldo")); psi.add (new JTextField(8)); psi.add (new JLabel("Inters")); psi.add (new JTextField(4)); f.setLayout ( new BoxLayout(f, BoxLayout.Y_AXIS)); f.add(pc); f.add(pt); f.add(psi); f.pack(); // Ajustar Frame a los contenidos f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
Programacinen GUIs
Gestoresde distribucin
Programacinen GUIs
DiseandonuestroJFrame
CuandounJFrametieneciertacomplejidad,loms correctoyeleganteesextenderestaclaseaadiendo todaslascaractersticasquenecesitemos Elconstructorpuedeutilizarseparalacreacinde componentes,gestoresdedistribucin,etc. Loscomponentespuedenconectarseareferenciasque seanatributosparateneraccesoaellosenmltiples operacionesdelaclase
Elenfoqueutilizadohastaahoraennuestraaplicacinesvlidonicamentepara aplicacionesmuysimples.VamosadefinirunanuevaclaseFAppCuentaapartir deJFrame
public class AppBanco { public static void main(String[] args) { FAppBanco f = new FAppBanco(); } }
Diseandonuestro JFrame
import java.awt.*; import javax.swing.*; public class FAppBanco extends JFrame { JTextField tfc, tft, tfs, tfi; public FAppBanco() { super("Gestin de Cuentas Bancarias"); JPanel pc = new JPanel(); pc.setLayout(new FlowLayout(FlowLayout.LEFT)); pc.add(new JLabel("Cdigo")); pc.add(tfc = new JTextField(8)); JPanel pt = new JPanel(); pt.setLayout(new FlowLayout(FlowLayout.LEFT)); pt.add(new JLabel("Titular")); pt.add(tft = new JTextField(30)); JPanel psi = new JPanel(); psi.setLayout (new FlowLayout(FlowLayout.LEFT)); psi.add(new JLabel("Saldo")); psi.add(tfs = new JTextField (8)); tfs.setEditable(false); // Establecermos a slo lectura el saldo psi.add(new JLabel("Inters")); psi.add(tfi = new JTextField(4)); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(pc); add(pt); add(psi); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } }
Programacinen GUIs
Diseandonuestro JFrame
Programacinen GUIs
UsaremosesteesquemaconlasclasesJFrame, JInternalFrameoJDialog,cuandocontenganunnmero relevantedecomponentesconunagestinmso menoscompleja,incluyendocapturayprocesamientode eventos Enestoscasoslanuevaclasedefinida,ademsdeser ensuncomponentedenuestrainterfaz,tieneuna segundafuncinmuyimportantedecoordinacin, gestinyprocesamientodelainformacinquellegaa travsdesuscomponenteshijos
Elenfoqueutilizadohastaahoraennuestraaplicacinesvlidonicamentepara aplicacionesmuysimples.VamosadefinirunanuevaclaseFAppCuentaapartir deJFrame
Diseandonuestro JFrame
Programacinen GUIs
Programacinen GUIs
Programacinen GUIs
// Crear panel de botones JPanel pb = new JPanel(new FlowLayout(FlowLayout.CENTER)); pb.add(bc = new JButton("Crear")); pb.add(bb = new JButton("Buscar")); pb.add(bo = new JButton(Operar)); bo.setEnabled(false); // En principio el botn de operar est deshabilitado pb.add(bc = new JButton(Salir)); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(pc); add(pt); add(psi); add(pm); // Aadir el panel de la tabla add(pb); // Aadir el panel de los botones pack(); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setVisible (true); } // Final del constructor de FAppBanco
Diseandonuestro JFrame
Programacinen GUIs
Capturadeeventos
Comovimosalprincipiodeltema,paralacapturade eventosSwingusaunesquemaasimilaraloscallbacks peroutilizandoclasesenlugardefunciones Cadaclasedecapturadeeventos(denominadosevent listeners)debeimplementarunainterfazconcretaen funcindeltipodeeventosquedeseacapturar Unavezimplementadoellistener,bastarconindicar stealcomponentedelcualdeseamoscapturarlos eventos
Capturadeeventos
Programacinen GUIs
Existenciertoseventlistenersquesoncomunesa todosloscomponentes:
FocusListener:capturaeventosrelacionadosconlarecepcinoprdidadelfoco KeyListener:capturapulsacionesdetecladosobreelcomponenteactivo MouseListener:capturalaentradaosalidadelcursorsobreuncomponente,as comopulsacionesdelosbotones MouseMotionListener:capturamovimientosdelratnsobreelcomponente
Otrossonespecficosdealgunoscomponentes:
ActionListener:capturaciertotipodeaccinrealizadasobreciertoscomponente. Porejemplo,pulsarunbotn,seleccionarunelementoenunalistadesplegableo unaopcinenunmen ChangeListener:registraloscambiossobreciertoscomponente.Porejemploun cambioeneldatodeunspinner,ounnuevovalorseleccionadoenunslider ItemListener:recogeelcambiodeestadoenuncomponentetipoon/off:check boxes,radiobuttonsylistasdesplegables ListSelectionListener:esunlistenerespecficoparadetectarlasselecciones mltiplesrealizadasenlistasytablas WindowListener:permiterecogerloseventosrelacionadosconlasventanas(cerrar, minimizar,maximizar,iconizar,etc.)enlosframes,framesinternosycuadrosde dilogo Capturadeeventos
Programacinen GUIs
Programacinen GUIs
Capturadeeventos
Programacinen GUIs
Haydosformasbsicasdeimplementarunlistener:
HacerqueelJFramequegeneraocontieneelcomponentegeneradordelevento seaunlistener,haciendoqueimplementelainterfazcorrespondiente(lomssimple yeficiente) Implementarunapequeaclaseinteriorquehagadelistener(lomsflexible)
Programacinen GUIs
Acontinuacin,implementaremoslanicaoperacindeestainterfazyalgunas operacionesauxiliares
public void actionPerformed(ActionEvent e) { long codigo = comprobarCodigo(); if (codigo == -1) return; float interes = comprobarInteres(); if (interes == -1) return; salvarCuentaActual(); // Si existe una cuenta en memoria, salvarla if (existeCuenta(codigo)) { System.out.println(La cuenta ya existe !); return; } c = new Cuenta(codigo, tft.getText(), interes); // Crear cuenta tfs.setText("0.0"); // Por defecto el saldo a 0 inicialmente bo.setEnabled(true); // Activar botn de operaciones }
Capturadeeventos
private long comprobarCodigo() { long codigo; try { codigo = Long.parseLong(tfc.getText ()); if (codigo < 0) throw new NumberFormatException(); } catch(NumberFormatException nfe) { System.out.println("Error en cdigo de cuenta"); return -1; } return codigo; } private float comprobarInteres() { float interes; try { interes = Float.parseFloat(tfi.getText ()); if (interes < 0 || interes > 100) throw new NumberFormatException(); } catch(NumberFormatException nfe) { System.out.println("Error en el formato del inters"); return -1; } return interes; } public void salvarCuentaActual() { if (c == null) return; try { c.salvar(); } catch (IOException e) { System.out.println("Error al salvar cuenta"); } }
Programacinen GUIs
Capturadeeventos
Programacinen GUIs
FinalmenteindicaremosalbotnCrearqueenvieloseventosallistener
// Estamos en el constructor de FAppBanco... JPanel pb = new JPanel (new FlowLayout (FlowLayout.CENTER)); pb.add (bc = new JButton ("Crear")); bc.addActionListener (this); pb.add (bb = new JButton ("Buscar")); pb.add (bo = new JButton ("Operacin")); bo.setEnabled (false); pb.add (bs = new JButton ("Salir")); // Continua el constructor...
Programacinen GUIs
Capturadeeventos
Programacinen GUIs
Capturadeeventos
public void actionPerformed (ActionEvent e) { if (e.getSource () == bc) { // Botn Crear long codigo = comprobarCodigo (); if (codigo == -1) return; float interes = comprobarInteres (); if (interes == -1) return; salvarCuentaActual (); if (existeCuenta (codigo)) { System.out.println ("Ya existe una cuenta con ese cdigo"); return; } c = new Cuenta (codigo, tft.getText (), interes); tfs.setText ("0.0"); bo.setEnabled (true); } if (e.getSource () == bb) { // Botn Buscar long codigo = comprobarCodigo (); if (codigo == -1) return; try { c = new Cuenta (codigo); // Cargar la cuenta // Establecer los valores de la cuenta en los editores tfc.setText (new Long (codigo).toString ()); tft.setText (c.leerTitular ()); tfs.setText (new Float (c.leerSaldo ()).toString ()); tfi.setText (new Float (c.leerInteres ()).toString ()); im.fireTableDataChanged (); // Actualizar tabla bo.setEnabled (true); } catch (IOException ioe) { System.out.println ("La cuenta no existe"); } catch (ClassNotFoundException cnfe){} }
Programacinen GUIs
Capturadeeventos
Programacinen GUIs if (e.getSource () == bs) terminarAplicacion (); } private void terminarAplicacion () { salvarCuentaActual (); // Salvar cuenta actual antes de salir System.exit (0); }
VamosaincluirenlaoperacionactionPerformed()deFAppBancoelcdigode procesamientodelosbotonesCrear,BuscarySalir
class InfoMovimientos extends AbstractTableModel { private final String[] nombreCols = { "Fecha", "Tipo", "Importe", "Saldo" }; SimpleDateFormat sdf; public InfoMovimientos () { super (); // Crear un formateador de fechas sdf = new SimpleDateFormat ("dd.MM.yyyy } public String getColumnName (int column) { return nombreCols[column]; } public int getColumnCount() { return 4; } Capturadeeventos
HH:mm");
Programacinen GUIs
// Devolver nmero de elementos public int getRowCount() { if (c != null) return c.numMovimientosHistorico (); else return 0; } // Devolver el campo nmero columnIndex del elemento nmero rowIndex public Object getValueAt(int rowIndex, int columnIndex) { Movimiento m = c.leerMovimientoHistorico (rowIndex); switch (columnIndex) { case 0: return sdf.format (m.fecha); case 1: switch (m.tipo) { case 'I': return "ingreso"; case 'R': return "reintegro"; } case 2: return new Float (m.importe); case 3: return new Float (m.saldo); } return ""; // Aqu no se debera llegar ! } }
Programacinen GUIs
Capturadeeventos
Programacinen GUIs
Conestonuestraaplicacinyaesutilizable.Podemoscargarunacuentaexistenteen discoocrearunanueva
Capturadeeventos
Programacinen GUIs
Cuadrosdedilogo
Loscuadrosdedilogosonventanasconunafuncin especfica
Notificaralusuariounerror,advertenciaoconsejo Pedirconfirmacinsobreunaoperacindeterminadaquesevaarealizar Obtenerlainformacinnecesariaparalarealizacindeunaoperacindeterminada
Programacinen GUIs
Cuadrosdedilogo
Programacinen GUIs
Elvalorretornadoporestaoperacinesunenteroque indicaelbotnpulsado:
YES_OPTION NO_OPTION CANCEL_OPTION CLOSED_OPTION
Cuadrosdedilogo
Programacinen GUIs
Cuadrosdedilogo
Programacinen GUIs
private long comprobarCodigo() { long codigo; try { codigo = Long.parseLong(tfc.getText ()); if (codigo < 0) throw new NumberFormatException(); } catch (NumberFormatException nfe) { JOptionPane.showMessageDialog(this, "Cdigo de cuenta incorrecto", "Error", JOptionPane.ERROR_MESSAGE); return -1; } return codigo; } private float comprobarInteres() { float interes; try { interes = Float.parseFloat(tfi.getText ()); if (interes < 0 || interes > 100) throw new NumberFormatException(); } catch (NumberFormatException nfe) { JOptionPane.showMessageDialog(this, "Inters incorrecto. Debe ser un valor real entre 0 y 100", "Error", JOptionPane.ERROR_MESSAGE); return -1; } return interes; }
Cuadrosdedilogo
Programacinen GUIs
Laformamscomnderealizarunapeticinde informacinporpartedelusuarioesconstruiruncuadro dedilogoamedida,normalmentedetipomodal Laclasequerepresentauncuadrodedilogogenrico esJDialog.Aligualqueenelcasodelosframes, dependiendodelacomplejidaddelcuadroque necesitemospodremosconstruirlodirectamenteo utilizarextensinparaconstruiruncuadrodedilogo personalizado ElconstructordeJDialogeselsiguiente: JDialog(<frameodialogopadre>,<ttulo>,<modal?>)
Cuadrosdedilogo
Programacinen GUIs
Programacinen GUIs
Paraquelosradiobuttonsdeingresoyreintegroseanautoexcluyentesdebenser agrupadosutilizandounButtonGroup
rbi = new JRadioButton("Ingreso", true); rbr = new JRadioButton("Reintegro"); ButtonGroup bg = new ButtonGroup(); bg.add(rbi); // Aadir los dos botones al grupo bg.add(rbr); pto.add(rbi); pto.add(rbr); JPanel pb = new JPanel(); pb.add(br = new JButton("Realizar")); pb.add(bc = new JButton("Cancelar")); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(p); add(pto); add(pb); pack(); // Capturar la pulsacin de los dos botones bc.addActionListener(this); br.addActionListener(this); operar = false; importe = 0; }
Cuadrosdedilogo
Programacinen GUIs
Cuadrosdedilogo
Programacinen GUIs
SlofaltalanzarelcuadrodedilogocuandosepulseelbotndeOperacin.Para ellointroduciremoselsiguientecdigoenlaoperacinactionPerformed()deFAppBanco
// Estamos en actionPerformed de la clase FAppBanco if (e.getSource() == bo) { DOperacion d = new DOperacion(this); // Construir dilogo y mostrarlo d.setVisible(true); // Se ha pulsado el botn de realizar operacin? if (d.realizarOperacion()) { if (d.esIngreso()) c.ingreso(d.leerImporte()); else c.reintegro(d.leerImporte()); // Cambiar valor en el text field de saldo tfs.setText(new Float(c.leerSaldo()).toString()); // Indicar a la tabla que hemos aadido una fila, para que se actualice im.fireTableRowsInserted(c.numMovimientosHistorico() - 1, c.numMovimientosHistorico() - 1); } }
Cuadrosdedilogo
Programacinen GUIs
Teclasrpidas
Losusuariosqueutilizanhabitualmenteunaaplicacin suelenrequerirciertasrpidasparaagilizarsuuso Normalmenteunateclarpidasueleseruna combinacindeltipoALT+tecla Adems,debeayudarsealusuarioaidentificarestas teclasrpidasmarcandolateclaenelcomponenteen cuestin
Teclasrpidas
Programacinen GUIs
Enloscomponentesquetienenasociadaunaetiqueta, comobotones,opcionesdemens,etc.lateclarpida seestablecemediante componente.setMnemonic(<tecla>) Lasteclasvienenidentificadasmedianteunaseriede cdigosenlaclaseKeyEvent.Consultarlareferenciade estaclaseparaobtenerlalistacompletadecdigos Lasteclasnormalestienenasociadascdigossencillos. PorejemplolateclaKsecodificacomoVK_K Silateclaindicadatieneuncarcterasociadoyste apareceenlaetiquetadelcomponente,Swingse encargaderesaltarloautomticamente
Teclasrpidas
Programacinen GUIs
Existencomponentesquenotienenningunaetiqueta (p.e.JTextField).Siasociamosteclasaestos componentes,elusuarionotieneformadesabercules son Sinembargo,estoscomponentessuelentenerun JLabelparasuidentificacin.Podemosasociarlatecla alJLabeldelasiguientemanera: label.setLabelFor(textfield) label.setDisplayedMnemonic(<tecla>) DeestaformaelJLabelmuestralateclarpida,pero realmenteeseleditorelquelarecibe Resultaobviodecirquenodebenrepetirselasteclas rpidasdentrodeunframeodialog
Teclasrpidas
Programacinen GUIs
Programacinen GUIs
Teniendoencuentaloanterior,aadirlasteclasrpidasanuestraaplicacinesuna cuestinrutinaria.Mostramosaqupartedelcdigomodificado
public FAppBanco() { super("Gestin de Cuentas Bancarias"); JLabel l; // Etiquetas y editores JPanel pc = new JPanel(); pc.setLayout(new FlowLayout(FlowLayout.LEFT)); pc.add(l = new JLabel("Cdigo")); pc.add(tfc = new JTextField(8)); l.setLabelFor(tfc); l.setDisplayedMnemonic(KeyEvent.VK_C); JPanel pt = new JPanel(); pt.setLayout(new FlowLayout(FlowLayout.LEFT)); pt.add(l = new JLabel("Titular")); pt.add(tft = new JTextField(30)); l.setLabelFor(tft); l.setDisplayedMnemonic(KeyEvent.VK_T); // Sigue el cdigo aqu... // Botones JPanel pb = new JPanel(new FlowLayout(FlowLayout.CENTER)); pb.add(bc = new JButton("Crear")); bc.setMnemonic(KeyEvent.VK_R); pb.add(bb = new JButton("Buscar")); bb.setMnemonic(KeyEvent.VK_B); pb.add(bo = new JButton("Operacin")); bo.setMnemonic(KeyEvent.VK_O); // Etc, etc... Teclasrpidas
Programacinen GUIs
LoslooksdeSwing
ParaterminarconnuestroejemployeltemadedicadoaprogramacinenGUIs podemosprobardistintoslooksparanuestraaplicacin
import javax.swing.UIManager; import javax.swing.JFrame; import javax.swing.JDialog; public class AppBanco { public AppBanco() { } public static void main(String[] args) { try { UIManager.setLookAndFeel(com.sun.java.swing.plaf.metal.MetalLookAndFeel"); //UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); //UIManager.setLookAndFeel(com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } catch (Exception e) {} JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); FAppBanco f = new FAppBanco(); } } LoslooksdeSwing
Programacinen GUIs
LookMetal(pordefectoenJava1.4)
LookGTK
LookMotif
LoslooksdeSwing