Your SlideShare is downloading. ×
Programacion en JAVA 2
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Programacion en JAVA 2

7,270

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,270
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
321
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 1. PROGRAMACIÓN GRÁFICA CON COMPONENTES SWINGSwing es una biblioteca gráfica para Java. Incluye widgets para interfaz gráfica deusuario. Una interfaz es lo que le permite a un usuario comunicarse con unprograma a través de componentes visuales como cajas de texto, botones,desplegables, tablas, etc. 1.1. COMPONENTEUn componente no es más que un objeto que representa un elemento de unainterfaz gráfica y que en su mayoría tienen una representación gráfica. Se puededividir en dos tipos:1. Simples o atómicos: Son los que no están formados por otros componentes: Ejemplo: Etiquetas, botones, cajas de texto.2. Contenedores: Son componentes que pueden contener a otros.  Contenedores de Alto Nivel: Son aquellos que brindan un espacio dentro de la pantalla para todos los elementos de una interfaz gráfica. Ejemplo: Frames, Applet.  Contenedores intermedios: Permiten agrupar y organizar los componentes de una interfaz gráfica dentro de un contenedor de alto nivel. Ejemplo: PanelesEl patrón de desarrollo que utiliza SWING es MVC (Modelo Vista Controlador), quepermite dividir una aplicación en 3 partes: o Modelo: Datos o Vista: Interfaz gráfica o Controlador: Permite manejar las interacciones del usuario con la interfaz gráfica y a su vez manejar los cambios entre la vista y el modelo. 1.2. JERARQUÍA DE COMPONENTESTodos los componentes para el diseño de una interfaz gráfica obedecen a unajerarquía de clases.La clase principal es java.awt.Component de la cual se heredan componentescomo java.awt.Button, java.awt.Label, etc..., y también se hereda la clasejava.awt.Container que representa a un objeto contenedor. Los componentessimples derivan de la clase JComponent, mientras los contenedores de la claseWindow.Programacion 2 Jhomara Luzuriaga
  • 2. Container Window JComponent PanelFrame Dialog AbstractButton JTextComponent ….. AppletJFrame JDialog JButton ….. JTextField JTextArea ….. 1.3. CONTENEDORES 1.3.1. Clase JFrameJAVA Frame es el componente, control u objeto principal de una aplicacion visual ografica en java.Para crear un Frame deberemos crear una instancia de JFrame, y si deseamosmodificar algunas propiedades de la ventana debemos crear una clase queextienda de JFrame.Ejemplo:import javax.swing.*;class Frame extends JFrame { //el constuctor public Frame(){ //Este es uno de los métodos que nuestra clase Frame ha //heredado de JFrame. Pone un título a la ventana setTitle("Hola!!!"); //método heredado que le da un tamaño a la ventana setSize(300,200); setVisible(true); }}Las ventanas JFrame son invisibles por defecto, se debe modificar la propiedad pordefecto de JFrame de manera que nuestra ventana sea visible, para esto sesobreescribe el método setVisible(true) con el parámetro true.Programacion 2 Jhomara Luzuriaga
  • 3. Algunos métodos de JFrame son:setResizable(boolean): Permite hacer modificable el tamaño de la ventanasetState(int): Modificar el tamaño de la ventana, recibe como parámetro un valorentero que corresponde a una constante de JFrame, que puede ser:JFrame.NORMAL, JFrame.ICONFIED.setExtendedState(int): Permite ampliar los estados de una ventana.setLocationRelativeTo(Component): Ubicar un componente en base a unsegundo componente enviado como parámetro. Para ubicar la ventana en el centrode la pantalla el parámetro deberá ser null.EJERCICIO:Crear un proyecto DiseñoVentanas y en una clase ejecutable crear 5 ventanas,cada una visualizada en un estado diferente (minimizado, maximizado,max_horizontal, max_vertical, y normal centrado), estableciendo un título en cadauna con el estado de la ventana. 1.3.2. Clase JDialogJDialog es un Componente que sirve para presentar diálogos que son ventanasauxiliares que se presentan cuando se registra un evento dentro de un programa,sirven para prevención o en su defecto se puede utilizar para dar información sobrealgo, los diálogos que JDialog muestra pueden ser modales o no modales, estoquiere decir que si son modales la ventana del diálogo bloquea las entradas a otrasventanas, este tipo de diálogos se pueden hacer también con JOptionPane.Todos los diálogos dependen de un frame, las modificaciones que se le hagan alframe afectaran a el diálogo, en caso de que el frame sea cerrado, minizado omaximizado, sus diálogos tendrán el mismo comportamientoUn JDialog siempre deberá tener un componente Parent del cual se derive, quedebe ser un contenedor de alto nivel y su efecto modal o no, de manera quecuando se crea una instancia de esta clase se deberá establecer estos parámetros.Ejemplo:Frame ventana= new Frame();JDialog cuadroDialogo= new JDialog(ventana, true);Programacion 2 Jhomara Luzuriaga
  • 4. En este caso hemos creado un JDialog cuyo parent es un JFrame ventana. LosJDialog obedecen un evento, es decir se mostrarán cuando sobre el parent serealice algún evento que invoque la aparición del JDialog. 1.3.3. Clase JPanelJPanel es un objeto de los llamados "contenedores". Es así porque sirven paracontener otros objetos.Una de las ventajas de añadir paneles sobre nuestro frame es que los paneles alderivar de JComponent poseen el método paintComponent que permite dibujar yescribir texto sobre el panel de modo sencillo.Para añadir un JPanel a nuestro frame primero obtenemos uno de los objetos queforman el frame: el “panel contenedor” (content pane). Para ello invocaremos almétodo getContentPane de nuestro JFrame. El objeto que nos devuelve será detipo Container:Container [nombre_del_contentpane] = frame.getContentPane();A continuación invocamos al método add del Container obtenido para añadir elpanel, pasándole el propio panel al método:[nombre_del_contentpane].add(nombre_del_panel);Ejemplo:import javax.swing.*;import java.awt.event.*;import java.awt.*;class Frame extends JFrame { public Frame(){ setTitle("Hola!!!"); setSize(300,200); //Le pido al Frame su objeto contenedor Container contentpane = getContentPane(); //Creo un objeto de tipo JPanel JPanel panel = new JPanel(); //Añado el panel en el objeto contenedor del frame contentpane.add(panel); //Pongo el color de fondo del panel de color rojo panel.setBackground(Color.RED); }}Programacion 2 Jhomara Luzuriaga
  • 5. Para agregar componentes a un panel se utiliza el método add: panel.add(new JButton(“Click aquí”));Si no señalamos la ubicación de los componentes en el panel, éstos se ubicanconforme se vayan añadiendo de manera horizontal, uno después de otro en todoel ancho de la ventana.Para visualizar el Frame que hemos creado se añade a la clase el método maindentro del cual se creará un objeto de nuestra clase Frame. La clase JFrameimplementa la interfaz Runneable, la cual permite ejecutar y visualizar el Framehasta que el usuario lo cancele.public static void main(String[] args) { new Frame();} 1.4. ALGUNOS COMPONENTES SIMPLESTodos los contenedores así como los componentes tienen propiedades que sepueden modificar mediante los métodos de la clase que corresponden, así comosus respectivos constructores.  Clase JLabelEs una etiqueta de texto que podemos colocar al lado de cualquier componentepara darle una indicación al usuario de cuál es la función de dicho componente.También se puede emplear a modo de título.JLabel label = new JLabel("1 x 7 = 7");  Clases JTextArea, JTextPane y JTextFieldSon componentes básicos del Swing de Java y su función principal es la decapturar texto ingresado desde teclado por el usuario.  Clase JTextFieldEstá pensado para obtener texto del usuario, este tecleará en él y cuando pulseintro podremos disponer del texto que tecleó. Únicamente se puede recoger unalínea de texto.Programacion 2 Jhomara Luzuriaga
  • 6. EJEMPLO:public class Frame1 extends JFrame {public Frame1() { setTitle("DATOS"); setSize(300, 200); JLabel lbl1 = new JLabel("Nombre"); JTextField txt1 = new JTextField(18); JLabel lbl2 = new JLabel("Edad"); JTextField txt2 = new JTextField(10); Container contentpane = getContentPane(); JPanel panel = new JPanel(); panel.setBackground(Color.CYAN); panel.add(lbl1); panel.add(txt1); panel.add(lbl2); panel.add(txt2); contentpane.add(panel); setVisible(true);}}EJECUCIÓN  Clase JPasswordFieldAl igual que los anteriores permite al Usuario ingresar un texto que es reemplazadopor un carácter que oculta lo que se escribe, por ejemplo: *. Se emplea para pedirlepasswords al usuario y evitar que puedan ser leídas por alguien.  Clase JButtonEsta clase nos permite crear botones, cuya acción al pulsar será programado conel manejo de eventos.Para crear un botón podemos utilizar los siguientes constructores:  JButton() Crea un botón sin etiqueta  JButton(String label) Crea un botón con una etiqueta de texto JButton t=new JButton(“Derecha”);Programacion 2 Jhomara Luzuriaga
  • 7. EJEMPLO:public Frame2() { setTitle("DATOS"); setSize(300, 200); JLabel lbl1 = new JLabel("Nombre"); JTextField txt1 = new JTextField(18); JLabel lbl2 = new JLabel("Edad"); JTextField txt2 = new JTextField(10); Container contentpane = getContentPane(); JPanel panel = new JPanel(); panel.add(lbl1); panel.add(txt1); panel.add(lbl2); panel.add(txt2); panel.add(new JButton("Click aquí")); contentpane.add(panel); setVisible(true);}EJERCICIO:Escriba 4 métodos para cambiar el estado de un botón, una etiqueta y un cuadrode texto:……………………………………………………………………………………………......………………………………………………………………………………………………..………………………………………………………………………………………………..………………………………………………………………………………………………..……………………………………………………………………………………………......………………………………………………………………………………………………..………………………………………………………………………………………………..………………………………………………………………………………………………..……………………………………………………………………………………………......………………………………………………………………………………………………..………………………………………………………………………………………………..………………………………………………………………………………………………..Programacion 2 Jhomara Luzuriaga
  • 8.  Clase JComboBoxPermite seleccionar un objeto (opción) de una lista que se visualiza al dar click enla pestaña de este componente.Los constructores de la clase son:JComboBox(ComboBoxModel amodel);Requiere un objeto Modelo para el ComboBoxJComboBox(Object [] items);Crea un combo, cuyos items corresponderán al arreglo de objetos.JComboBox(Vector? items);Crea un combo, cuyos items corresponderán a los elementos del Vector.EJEMPLO:public class Selector extends JFrame { public Selector() { setTitle("Selector!!!"); setSize(300, 200); String[] opciones = {"Arriba", "Abajo", "Derecha", "Izquierda", "Todas las direcciones"}; JComboBox cmbLista = new JComboBox(opciones); Container contentpane = getContentPane(); JPanel panel = new JPanel(); panel.add(cmbLista); contentpane.add(panel); setLocationRelativeTo(null); setVisible(true); }}  Clase JCheckboxSe trata de un componente empleado para tomar información del usuario sobrecosas del tipo “sí”, “no”.Dos de los constructores de un JCheckBox son:o JCheckBox(String) Crea un JCheckBox con etiquetaProgramacion 2 Jhomara Luzuriaga
  • 9. o JCheckBox(String,boolean) Crea un JCheckBox con etiqueta y aparece seleccionado  Clase JRadioButtonDos de los constructores de un JRadioButton son: o JRadioButton (String) Crea un JRadioButton con etiqueta o JRadioButton(String,boolean) Crea un JRadioButton con etiqueta y aparece seleccionadoPara utilizar este componente debe ser añadido a un grupo de manera que permitaseleccionar una sola opción entre las del grupo. Para ello se utiliza el componenteButtonGroup.Ejemplo: ButtonGroup bg= new ButtonGroup(); JRadioButton rb1=new JRadioButton("Radio1"); JRadioButton rb2=new JRadioButton("Radio2"); bg.add(rb1); bg.add(rb2); ... panel.add(rb1); panel.add(rb2); ... ...Ejercicio:Crea una clase EjercicioSwing que extienda de JFrame y que contenga loscomponentes de la siguiente figura. El tamaño del Frame será de (260 x 250).Programacion 2 Jhomara Luzuriaga
  • 10. 2. LAYOUT MANAGERS 2.1. ConceptoEl layout manager es el encargado de decidir en qué posiciones se renderizarán loscomponentes, que tamaño tendrán, que porción del contenedor abarcarán, etc.Un contenedor es un componente Java que puede contener otros componentes.Si queremos cambiar el layout manager de un contenedor en un momento dado,tan sólo tendremos que llamar al método:contenedor.setLayout(LayoutManager layout);Si en cualquier momento decidimos encargarnos nosotros mismos de la gestión decomponentes tan sólo tendremos que escribir:contenedor.setLayout(null);Cada componente de nuestro interfaz gráfico tiene asignada una coordenadahorizontal, una coordenada vertical, una longitud y una anchura determinadas.Estos valores serán los que se utilizarán para renderizar el componente enpantalla.La clase java.awt.Component nos ofrece una serie de métodos para podermodificar los valores de los atributos anteriores:public void setSize(Dimension size);public void setBounds(Rectangle r); 2.2. Layout nullMuchos deciden no utilizar layouts para ubicar los componentes de la ventana, eneste caso el Layout se establece a Nulll y en el código se decide la posición decada botón y qué tamaño ocupa.contenedor.setLayout(null); // Eliminamos el layoutcontenedor.add (boton); // Añadimos el botónboton.setBounds (10,10,40,20); // Botón en posicion 10,10 con ancho 40 pixels y alto 20Esto, no es recomendable. Si se expande la ventana los componentes seguirán ensu sitio, no se expandirán con la ventana. Si cambiamos de sistema operativo,Programacion 2 Jhomara Luzuriaga
  • 11. resolución de pantalla o fuente de letra, los componentes no se visualizaránestéticamente bien. 2.3. FlowLayoutEs el que tienen los paneles por defecto. Los objetos se van colocando en filas enel mismo orden en que se añadieron al contenedor. Cuando se llena una fila sepasa a la siguiente.Tiene tres posibles constructores: FlowLayout();Crea el layout sin añadirle los componentes.FlowLayout(FlowLayout.LEFT[RIGTH][CENTER]);Indica la alineación de los componentes: a la izquierda, derecha o centro.FlowLayout(FlowLayout.LEFT, gap_horizontal,gap_vertical);Además de la alineación de los componentes indica un espaciado (gap) entre losdistintos componentes, de tal modo que no aparecen unos junto a otros.FlowLayout respeta siempre el tamaño preferido de cada componente. Loscomponentes de cada fila se encuentran equiespaciados por un espacio de 5puntos horizontal y verticalmente.Primero se establece el layout a utilizar, luego se añaden los componentes alpanel.contenedor.setLayout(new FlowLayout());contenedor.add(boton);contenedor.add(textField);contenedor.add(checkBox);Ejemplo: import javax.swing.*; import java.awt.*; class TestFlowLayout extends JFrame{ public static void main(String[] args) { TestFlowLayout frame = new TestFlowLayout ();Programacion 2 Jhomara Luzuriaga
  • 12. JPanel panel = new JPanel(); JButton boton1 = new JButton("botón 1"); JButton boton2 = new JButton("Este es el botón 2"); JButton boton3 = new JButton("botón 3"); panel.add(boton1); panel.add(boton2); panel.add(boton3); frame.setContentPane(panel); frame.setSize(350, 150); frame.setTitle("Prueba de FlowLayout"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 2.4. BorderLayoutEste layout distribuye los componentes en cinco zonas predeterminadas: son norte(NORTH), sur (SOUTH), este (EAST), oeste (WEST) y centro (CENTER). Si noespecificamos ninguna región por defecto el componente se inserta en el centro delcontenedor.Programacion 2 Jhomara Luzuriaga
  • 13. Posee dos contructores:BorderLayout();BorderLayout(int gap_horizontal, int gap_vertical);El segundo creará el layout dejando los espacios horizontales y verticales entre susdistintas zonas.Al momento de añadir componentes se debe especificar en el método add la regióndonde queremos añadir el componente:panel.add(componente_a_añadir, BorderLayout.NORTH);Ejemplo: class TestBorderLayout extends JFrame{ public static void main(String[] args) { TestBorderLayout frame = new TestBorderLayout (); Container panel = frame.getContentPane(); JButton norte = new JButton("Norte"); JButton sur = new JButton("Sur"); JButton este = new JButton("Este"); JButton oeste = new JButton("Oeste"); JButton centro = new JButton("Centro"); panel.add(norte, BorderLayout.NORTH); panel.add(sur, BorderLayout.SOUTH); panel.add(este, BorderLayout.EAST); panel.add(oeste, BorderLayout.WEST); panel.add(centro, BorderLayout.CENTER); frame.setSize(350, 250); frame.setTitle("Prueba de BorderLayoutLayout"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);} }} 2.5. GridLayoutDistribuye los componentes de un contenedor en celdas y se ordenarán en el ordencomo sean añadidas, de izquierda a derecha y de arriba hacia abajo.El GridLayout es adecuado para hacer tableros, calculadoras en que todos losbotones son iguales, etc.Programacion 2 Jhomara Luzuriaga
  • 14. Todas las cuadrículas serán del mismo tamaño y crecerán o se harán máspequeñas hasta ocupar toda el área del contenedor. Hay dos posiblesconstructores:GridLayout(int filas, int columnas);GridLayout(int columnas, int filas, int gap_horizontal, intgat_vertical);Especifica espaciados verticales y horizontales entre las cuadrículas.Ejemplo: import javax.swing.*; import java.awt.*; class TestGridLayout extends JFrame{ public static void main(String[] args) { TestGridLayout frame = new TestGridLayout(); Container container = frame.getContentPane(); int X = 3; int Y = 3; container.setLayout(new GridLayout(X, Y)); for (int i = 0; i < X; i++) { for (int j = 0; j < Y; j++) { container.add(new JButton(i + "x" + j)); } } frame.setSize(350, 250); frame.setTitle("Prueba de BorderLayoutLayout"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }Programacion 2 Jhomara Luzuriaga
  • 15. 2.6. GridBagLayout El GridBagLayout es de los layouts más versátiles y complejos de usar. Es como el GridLayout, pone los componentes en forma de matriz (cuadrícula), pero permite que las celdas y los componentes en ellas tengan tamaños variados. Las celdas se crean a medida que se agregan los componentes.  Es posible hacer que un componente ocupe varias celdas  Un componente puede expandirse o no con su celda  Si no se expande, puede quedar en el centro de la celda o pegarse a sus bordes o esquinas.  Las columnas al igual que las filas pueden ensancharse o no al estirar la ventana y la proporción podemos decidirla GridBagConstraints es una clase en cuyos atributos se guarda información de cómo y dónde añadir el componente. GridBagConstraints.gridx nos dice la posición x del componente, es decir, el número de columna en la que está el componente, siendo la columna 0 la primera columna de la izquierda. GridBagConstraints.gridy nos dice la posición y del componente, es decir, el número de fila en la que está el componente, siendo la fila 0 la primera fila de la parte de arriba. c.gridx=1, c.gridy=0c.gridx=0, c.gridy=0c.gridx=0, c.gridy=1 c.gridx=1, c.gridy=1 c.gridx=2, c.gridy=0 Programacion 2 Jhomara Luzuriaga
  • 16. GridBagConstraints.gridwidth nos dice cuántas celdas en horizontal debe ocupar el componente. El ancho del componente. GridBagConstraints.gridheight nos dice cuantas celdas en vertical debe ocupar el componente. El alto del componente. Su valor puede ser:  Un número cardinal, en este caso indica exactamente el número de filas o columnas que ocupará el componente.  GridBagConstraints.RELATIVE, indica que el componente ocupará el espacio disponible desde la fila o columna actual hasta la última fila o columna disponibles.  GridBagConstraints.REMAINDER, indica que el componente es el último de la fila actual o columna actual. c.gridwidth=GridBagCostraints.RELATIVE c.gridwidth=GridBagCostraints.REMAINDER c.gridheigth=1 c.gridheigth=1 c.gridwidth=1 c.gridheigth=1c.gridwidth=GridBagCostraints.RELATIVEc.gridheigth=GridBagConstraints.RELATIVE c.gridwidth=GridBagCostraints.REMAINDER c.gridheigth=GridBagConstraints.REMAINDER c.gridwidth=GridBagCostraints.REMAINDER c.gridheigth=GridBagConstraints.RELATIVE Algunas constantes de esta clase son: Anchor establece la alineación del componente, se utiliza cuando el éste es más pequeño que el área utilizada: NORTH, SOUTH, EAST, WEAST, NORTHWEST, SOUTHWEST, NORTHEAST, SOUTHEAST y CENTER. Programacion 2 Jhomara Luzuriaga
  • 17. Fill establece el relleno de la celda: HORIZONTAL, VERTICAL, BOTH, NONEEn este caso las celdas ocupan todo el contenedor, pero eso es debido a que se hautilizado los atributos weightx y weighty.weightx y weightyLos atributos weightx y weighty especifican el porcentaje de espacio libre queocupará una celda determinada.En el ejemplo anterior si no utilizamos estos atributos tendríamos:Programacion 2 Jhomara Luzuriaga
  • 18. Este espacio libre (flechas verdes) se dividirá entre todas las celdas queespecifiquen valores dentro de los atributos weightx y weighty. La forma deespecificar el espacio que quiere ocupar cada componente es mediante un númeroentre 0.0 y 1.0. Este número representa al porcentaje de espacio libre que ocuparácada celda.InsetsEl atributo insets es un objeto de la clase java.awt.Insets cuyo constructor es:Insets(int top, int left, int bottom, int right)Programacion 2 Jhomara Luzuriaga
  • 19. Los parámetros del constructor especifican el espacio que se dejará de márgen.Veamos un ejemplo:Ejemplo:Frame que distribuye los siguientes componentes:public class TestGridBagLayout extends JFrame{ public static void main(String[] args) { TestGridBagLayout f=new TestGridBagLayout(); Container container = f.getContentPane(); container.setLayout(new GridBagLayout()); ((JPanel) container).setBorder( BorderFactory.createTitledBorder("Entrada al sistema")); GridBagConstraints c = new GridBagConstraints(); c.weightx = 0.4; c.weighty = 1.0; c.gridwidth = GridBagConstraints.RELATIVE; c.gridheight = GridBagConstraints.RELATIVE; c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.WEST; c.insets = new Insets(2, 5, 2, 0); container.add(new JLabel("Usuario"), c);//Se debe definir los parámetros para cada uno de los componentes. c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = GridBagConstraints.RELATIVE;Programacion 2 Jhomara Luzuriaga
  • 20. c.weightx = 1.0; c.insets = new Insets(2, 0, 2, 5); container.add(new JTextField(), c); c.gridwidth = GridBagConstraints.RELATIVE; c.gridheight = GridBagConstraints.REMAINDER; c.weightx = 0.4; c.insets = new Insets(2, 5, 2, 0); container.add(new JLabel("Contraseña"), c); c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = GridBagConstraints.REMAINDER; c.weightx = 1.0; c.insets = new Insets(2, 0, 2, 5); container.add(new JTextField(), c); f.setSize(220, 110); f.setTitle("Login"); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}Resultado: 2.7. BoxLayoutEste layout manager es uno de los más sencillos y de los más útiles. Aquí loscomponentes son agrupados horizontal o verticalmente dentro del contenedor quelos contiene. Los componentes no se solapan de ningún modo. La anidación depaneles utilizando este layout manager nos puede permitir crear interfaces muycomplejos como nos permite GridBagLayout pero a costa de la creación de objetospesados como son paneles.El constructor de BoxLayout es muy simple:public BoxLayout(Container objetivo, int eje);Donde el parámetro entero eje puede tomar los valores: X_AXIS, los componentes se organizan de izquierda a derecha y en horizontal. Y_AXIS, los componentes se organizan de arriba a abajo y en vertical. LINE_AXIS, los componentes se organizan como si estuviesen en una línea. Para ello se tiene en cuenta la propiedad ComponentOrientation del contenedor. Si esta propiedad es horizontal entonces los componentes se organizaránProgramacion 2 Jhomara Luzuriaga
  • 21. horizontalmente y además según su valor lo harán de izquierda a derecha o de derecha a izquierda. En otro caso se organizarán verticalmente de arriba a abajo. PAGE_AXIS, los componentes se organizan como si estuvieran en una página. Para ello se tiene en cuenta la propiedad ComponentOrientation del contenedor.Los componentes se organizan en el orden en el que se añaden al contenedor.En el caso de organización horizontal, BoxLayout intentará que todos loscomponentes del contenedor tengan la misma altura, siendo esta la máxima de loselementos del contenedor. En caso de que no sea posible, BoxLayout intentaráalinearlos a todos horizontalmente de modo que sus centros coincidan en una líneahorizontal imaginaria que los atraviese, de manera similar, si la organización esvertical.A menudo, en lugar de utilizar BoxLayout directamente, se utiliza la clase Box quees un contenedor ligero que tiene como layout manager un BoxLayout y que ofrecemétodos que hacen que su manejo sea muy sencillo.EJEMPLO:import java.awt.*;import javax.swing.*;public class TestBoxLayout extends JFrame { public static void main(String[] args) { TestBoxLayout f = new TestBoxLayout(); Container container = f.getContentPane(); container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); ((JPanel) container).setBorder( BorderFactory.createTitledBorder("Demo BoxLayout")); JPanel panel1 = new JPanel(); panel1.setBorder(BorderFactory.createTitledBorder("Panel1")); JPanel panel2 = new JPanel(); panel2.setBorder(BorderFactory.createTitledBorder("Panel2")); panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS)); panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS)); for (int i = 0; i < 3; i++) { panel1.add(new JButton("Botón número " + i)); panel2.add(new JButton("Botón número " + i)); } container.add(panel1); container.add(panel2); f.setSize(285, 300); f.setTitle("Demo BoxLayout"); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}Programacion 2 Jhomara Luzuriaga
  • 22. 2.8. SpringLayoutEste layout manager está únicamente disponible a partir de la versión 1.4 del JDK.SpringLayout define los componentes que estarán dentro del interfaz y la relaciónentre estos componentes, es decir, el espacio que habrá entre ellos. SpringLayoutintentará respetar siempre que pueda el tamaño preferido de los componentes.El espacio entre los componentes se define utilizando objetos Spring. Cada objetoSpring tiene cuatro propiedades, sus tamaños máximo, mínimo y preferido juntocon su tamaño actual. (x, y, width, height)Todos estos objetos Spring se acumulan formando un conjunto de restriccionesque estarán en un objeto de tipo SpringLayout.Constraints.Para crear un objeto Spring:Spring.constant(min, pref, max);Spring.constant(int valor);El método para ubicar un componente aplicando constraint tespecto de otro:putConstraint(borde, componente, constraint, borde, componenteRelativo);Programacion 2 Jhomara Luzuriaga
  • 23. Ejemplo:public class TestSpringLayout extends JFrame{ public static void main(String[] args) { TestSpringLayout f=new TestSpringLayout(); SpringLayout sl=new SpringLayout(); Container container = f.getContentPane(); container.setLayout(sl); ((JPanel)container).setBorder(BorderFactory.createTitledBorder( "Entrada al sistema")); JLabel lblUsuario =new JLabel("Usuario"); JLabel lblContraseña=new JLabel("Contraseña"); JTextField txtUsuario=new JTextField(10); JTextField txtContraseña=new JTextField(10); container.add(lblUsuario); container.add(txtUsuario); container.add(lblContraseña); container.add(txtContraseña); sl.putConstraint(SpringLayout.WEST, lblUsuario, Spring.constant(30),SpringLayout.WEST,container); sl.putConstraint(SpringLayout.NORTH, lblUsuario, Spring.constant(20),SpringLayout.NORTH,container); sl.putConstraint(SpringLayout.WEST,txtUsuario, Spring.constant(35),SpringLayout.EAST,lblUsuario); sl.putConstraint(SpringLayout.NORTH, txtUsuario, Spring.constant(20),SpringLayout.NORTH,container); sl.putConstraint(SpringLayout.WEST, lblContraseña, Spring.constant(30),SpringLayout.WEST,container); sl.putConstraint(SpringLayout.NORTH, lblContraseña, Spring.constant(25),SpringLayout.NORTH,lblUsuario); sl.putConstraint(SpringLayout.WEST,txtContraseña, Spring.constant(15),SpringLayout.EAST,lblContraseña); sl.putConstraint(SpringLayout.NORTH, txtContraseña, Spring.constant(25),SpringLayout.NORTH,txtUsuario); f.setSize(250, 150); f.setTitle("Login"); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}Programacion 2 Jhomara Luzuriaga
  • 24. EJERCICIO:Diseñe la siguiente pantalla utilizando el Layout más indicado para la ubicación delos componentes en el FrameProgramacion 2 Jhomara Luzuriaga
  • 25. 3. ALGUNOS COMPONENTES COMPLEJOS 3.1. Componentes contenedores de otros.  Clase JMenuBarEs una barra de menús, en ella se pueden añadir los siguientes componentes:Clase JMenu: Es una opción de la cual se pueden desplegar mas opciones.Clase JMenuItem: Es una opción final (no desplega mas opciones) JMenu JMenuBar JMenuItemEJEMPLO:public class VentanaMenu extends JFrame{ public JMenuBar barraMenu=new JMenuBar(); public VentanaMenu(){ super("Test Menu"); setSize(300,200); agregarComponentes(); } public void agregarComponentes(){ JMenu mnArchivo=new JMenu("Archivo"); mnArchivo.add(new JMenuItem("Nuevo")); mnArchivo.add(new JMenuItem("Guardar",new ImageIcon(getClass().getResource("zip.gif")))); mnArchivo.add(new JMenuItem("Abrir")); mnArchivo.add(new JMenuItem("Cerrar")); barraMenu.add(mnArchivo); JMenu mnEditar=new JMenu("Editar"); JMenu mnAyuda=new JMenu("Ayuda"); barraMenu.add(mnEditar); barraMenu.add(mnAyuda); BorderLayout bl=new BorderLayout(); this.getContentPane().setLayout(bl); this.getContentPane().add(barraMenu,BorderLayout.NORTH); } public static void main(String[] args) { new VentanaMenu().setVisible(true); }Programacion 2 Jhomara Luzuriaga
  • 26. }RESULTADO:Ejercicio:Modifique la clase anterior para: Agregar al Menu Archivo el menu Guardar Como y a éste los ítems: Imagen, Texto, Articulo Completo. Agregar en el Menu Editar los ítems: Deshacer, Rehacer, Seleccionar Todo, Buscar. Agregar una imagen en los Menus de la barra principal.  Clase JScrollPaneEs un panel que permite visualizar un componente de un tamaño mayor que eldisponible, mediante el uso de barras de desplazamiento.Como su nombre lo indica, funciona como un contenedor, de manera que podemosagregar un componente que requiera mayor espacio en el Frame.JLabel imagen=new JLabel(new ImageIcon(getClass().getResource("/imagenes/imagen1.jpg")));JScrollPane panel=new JScrollPane(imagen);Programacion 2 Jhomara Luzuriaga
  • 27.  Clase JSplitPanePermite visualizar dos componentes, uno a cada lado, con la posibilidad demodificar la cantidad de espacio otorgado a cada uno. Se puede agregar uncontenedor como un JPanel en cada lado del Split y este a su vez contener máscomponentes. Además se puede modificar una propiedad que indica la disposiciónde los componentes: horizontal o vertical.//espacio del primer componente con respecto del segundosplit.setDividerLocation(150);//separación entre componentes del Splitsplit.setDividerSize(20);//cambiando el componente de la izquierda y derechasplit.setLeftComponent(componenteIzquierda);split.setRightComponent(componenteDerecha);EJERCICIO:SPLITPANE Y SCROLLPANEUbicar el primer componente con mayor ventaja que el segundo, con respecto altamaño del contenedor principal y una división de 20pix.Programacion 2 Jhomara Luzuriaga
  • 28.  Clase JTabbedPanePermite definir varias hojas con pestañas, que pueden contener otroscomponentes. El componente básico de cada hoja debe ser un Panel que es el queagrupe el resto de componentes.Para agregar más hojas basta con añadir un panel al TabbedPane.Ejemplo:JTabbedPane tabbed=new JTabbedPane();tabbed.add("Tabbed 1", new JPanel());tabbed.add("Tabbed 2",new JPanel()); 3.2. COMPONENTES CON MODELO DE DATOS.Los componentes que permiten mostrar un listado o un conjunto de objetos sepueden crear a partir de un modelo de datos. Por ejemplo un componente sencillocomo el JComboBox contiene un arreglo de objetos. 3.2.1. JLISTUn componente JList permite administrar una lista de elementos de tipo Object conuna representación en StringLos constructores de la clase JList son:  JList()  JList(ListModel dataModel)  JList(Object[ ] listData)  JList(Vector? listData)El segundo constructor recibe un objeto tipo ListModel, como ésta es una interfaceutilizaremos una clase que la implementa: DefaultListModelProgramacion 2 Jhomara Luzuriaga
  • 29. DefaultListModel modeloLista=new DefaultListModel();Un objeto de esta clase puede implementar el método addElement(Object o).modeloLista.addElement(“Elemento1”);//Object de tipo String.modeloLista.addElement(“Elemento2”);JList lista=new JList(modeloLista);// Se crea un JList con el modelo de elementos.Ejemplo:public class Lista extends JFrame{private JList listaCursos;private DefaultListModel modeloListaCursos;public Lista() { agregarComponentes(); setTitle("CURSOS"); setContentPane(p); setSize(250, 200)}public void agregarComponentes(){ modeloListaCursos=new DefaultListModel(); modeloListaCursos.addElement("C++"); modeloListaCursos.addElement("Java"); modeloListaCursos.addElement("OpenOffice"); modeloListaCursos.addElement("Linux"); modeloListaCursos.addElement("Phyton"); listaCursos=new JList(modeloListaCursos); JPanel p=new JPanel(); p.setBorder(BorderFactory.createTitledBorder("Lista de Cursos")); p.add(listaCursos);}public static void main(String []args){ new Lista().setVisible(true);}}Resultado:Programacion 2 Jhomara Luzuriaga
  • 30. EJERCICIOCrear un Proyecto denominado ComponentesAvanzados y dentro del paqueteventanas diseñar un clase VentanaPrincipal que extienda de JFrame y que tengalos constructores necesarios para modificar sus propiedades.Crear una clase ComponenteLista que permita utilizar la VentanaPrincipal paraañadir un JList similar al ejemplo, que contenga la lista de 5 estudiantes del salón. 3.2.2. JTABLEJTable es uno de los componentes con APIs más extensas y también soncomplejos, esa complejidad le permite ser más personalizable y potente.Los constructores que proporciona esta clase son:  JTable()  JTable(int numRows, int numColumns)  JTable(Object[][] rowData, Object[] columnNames)  JTable(TableModel dm)  JTable(TableModel dm, TableColumnModel cm)  JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)  JTable(Vector rowData, Vector columnNames)El primer constructor permite crear un JTable con las propiedades por defecto, elsegundo crea la tabla como una matríz de numRows x numColumns.Vamos a ver un ejemplo utilizando el constructor, que permite crear una tabla conuna matriz de datos (rowData) y los nombres de las columnas contenidos en unarray de String.Nuestro primer ejemplo tendrá las siguientes columnas:String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Años de Practica", "Soltero(a)"};Y utilizaremos el siguiente array para su contenido:Programacion 2 Jhomara Luzuriaga
  • 31. Object[][] data = { {"Maria", "Castro", "Esquiar", new Integer(5), newBoolean(false)}, {"Lucas", "Herrera", "Patinar", new Integer(3), newBoolean(true)}, {"Kthya", "Espinoza", "Escalar", new Integer(2), newBoolean(false)}, {"Marco", "Molina", "Correr", new Integer(7), newBoolean(true)}, {"Angela", "Díaz", "Nadar", new Integer(4), newBoolean(false)}};La creación de una tabla con estos datos sería:JTable table = new JTable(data, columnNames);Ejemplo:import java.awt.BorderLayout;import java.awt.Dimension;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;public class EjemploTabla1 extends JFrame{ public EjemploTabla1() { super("Ejemplo 1"); //array bidimencional de objetos con los datos de la tabla Object[][] data = { {"Maria", "Castro", "Esquiar", new Integer(5), new Boolean(false)}, {"Lucas", "Herrera", "Patinar", new Integer(3), new Boolean(true)}, {"Kthya", "Espinoza", "Escalar", new Integer(2), new Boolean(false)}, {"Marco", "Molina", "Correr", new Integer(7), new Boolean(true)}, {"Angela", "Díaz", "Nadar", new Integer(4), new Boolean(false)}}; //array de Strings con los títulos de las columnas String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Años de Practica", "Soltero(a)"}; //se crea la Tabla JTable table = new JTable(data, columnNames); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Creamos un JscrollPane y le agregamos la JTableProgramacion 2 Jhomara Luzuriaga
  • 32. JScrollPane scrollPane = new JScrollPane(table); //Agregamos el JScrollPane al contenedor getContentPane().add(scrollPane, BorderLayout.CENTER); } public static void main(String[] args) { EjemploTabla1 frame = new EjemploTabla1(); frame.pack(); frame.setVisible(true); }}  Modelo de tablaLos modelos de tabla son objetos que implementan la interface TableModel; através de ellos es posible personalizar mucho más y mejor el comportamiento delos componentes JTable, permitiendo utilizar al máximo sus potencialidades.Todas las tablas cuentan con un modelo de tabla, aunque en el ejemplo 1 no sehaya especificado, existe uno por omisiónLa clase AbstractTableModel es la que implementa directamente ala interface TableModel, aunque es esta clase la que se recomienda extender parautilizarla como modelo de tabla, existe un modelo de tabla predeterminado quefacilita mucho el trabajo con tablas. Este modelo predeterminado es laclase DefaultTableModel  DefaultTableModelEsta clase tiene el siguiente diagrama de herencia:java.lang.Object | +-javax.swing.table.AbstractTableModel | +-javax.swing.table.DefautTableModelNuevamente, antes de comenzar a utilizar esta clase, veremos cuales sonlos constructores con que cuenta:  DefaultTableModel()  DefaultTableModel(int numRows, int numColumns)  DefaultTableModel(Object[][] data, Object[] columnNames)  DefaultTableModel(Object[] columnNames, int numRows)  DefaultTableModel(Vector columnNames, int numRows)  DefaultTableModel(Vector data, Vector columNames)Programacion 2 Jhomara Luzuriaga
  • 33. Utilizaremos el constructor que nos permite crear un DefaultTableModel, a partir delos datos con que ya contamos del ejemplo anterior:Por lo tanto, el constructor queda así: DefaultTableModel dtm= new DefaultTableModel(data, columnNames);Despues de haber creado el modelo de tabla, dtm en el ejemplo, se creala tabla con el constructor correspondiente: JTable table = new JTable(dtm);Una vez hecho esto, cualquier modificación que se realice sobre el modelo detabla se reflejará directamente en la tabla.  Agregar una columna: String[] newColumn= {"Contabilidad", "Informatica", "Medicina", "Musica", "Diseño"}; dtm.addColumn("Carrera",newColumn);  Agregar una fila: Object[] newRow={"Jose", "Ordóñez", "Tenis", new Integer(5), new Boolean(false), "Pera"}; dtm.addRow(newRow);  Modificar una celda en especial, en este ejemplo la celda ubicada en la columna 1, fila 1: dtm.setValueAt("Catherine", 1, 1);Puedes revisar los métodos que proporciona la clase DefaultTableModel paraconocer qué otras cosas puedes realizar con ella.Ejemploimport javax.swing.JTable;import javax.swing.table.DefaultTableModel;import javax.swing.JScrollPane;import javax.swing.JPanel;import javax.swing.JFrame;public class EjemploTabla2 extends JFrame { public EjemploTabla2() { super("Ejemplo 2"); //array bidimencional de objetos con los datos de la tabla Object[][] data = { {"Maria","Castro", "Esquiar", new Integer(5), new Boolean(false)}, {"Lucas", "Herrera", "Patinar", new Integer(3), new Boolean(true)},Programacion 2 Jhomara Luzuriaga
  • 34. {"Kthya","Espinoza", "Escalar", new Integer(2), new Boolean(false)}, {"Marco", "Molina", "Correr", new Integer(7), new Boolean(true)}, {"Angela","Díaz", "Nadar", new Integer(4), new Boolean(false)}}; //array de Strings con los títulos de las columnas String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Años de Practica", "Soltero(a)"}; //creamos el Modelo de la tabla con los datos anteriores DefaultTableModel dtm= new DefaultTableModel(data, columnNames); //se crea la Tabla con el modelo DefaultTableModel final JTable tabla = new JTable(dtm); // una vez creada la tabla con su modelo // podemos agregar columnas String[] newColumn= {"Contabilidad", "Informatica", "Medicina", "Musica", "Diseño" }; dtm.addColumn("Carrera",newColumn); //filas Object[] newRow={"José", "Ordóñez", "Tenis", new Integer(5), new Boolean(false), "Informatica"}; dtm.addRow(newRow); //o modificar una celda en especifico dtm.setValueAt("Sofía", 1, 1); //se define el tamaño tabla.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Creamos un JscrollPane y le agregamos la JTable JScrollPane scrollPane = new JScrollPane(tabla); //Agregamos el JScrollPane al contenedor getContentPane().add(scrollPane, BorderLayout.CENTER); } public static void main(String[] args) { EjemploTabla2 frame = new EjemploTabla2(); frame.pack(); frame.setVisible(true); }}  AbstractTableModelCon esta clase es posible implementar, de una manera más completa y eficiente,los métodos necesarios para crear un modelo de tabla.Para crear un modelo de tabla personalizado, lo primero que necesitamoses extender la clase AbstractTableModel. class MyTableModel extends AbstractTableModel { ..... }Como es una clase Abstracta debemos de implementar los 3 métodos siguientes:Programacion 2 Jhomara Luzuriaga
  • 35. class MyTableModel extends AbstractTableModel { public int getRowCount(){ ... } public int getColumnCount(){ ... } public Object getValueAt(int row, int column){ ... } }Con la implementación de los métodos anteriores, las celdas de la tabla NO seráneditables y NO se podrán modificar los valores de cada una de ellas.Si deseamos tener un mecanismo para modificar los valores de las celdas dela tabla, tenemos que sobrescribir el método setValueAt de laclase AbstractTableModel: class MyTableModel extends AbstractTableModel { ... ... public void setValueAt(Object value, int row, int col) { ... } }Y, si la modificación de los valores de las celdas, se hace directamente sobre ellas,necesitamos indicar a nuestro modelo de tabla que las celdas de la tabla seráneditables, esto se hace sobrescribiendo el método isCellEditable: class MyTableModel extends AbstractTableModel { ... public boolean isCellEditable(int row, int col) { ... } }Ya lo único que haría falta sería agregar los nombres de las columnas denuestra tabla y definir su contenido inicial: class MyTableModel extends AbstractTableModel { final String[] columnNames = { ... } final Object[][] data = { ... } ... }Programacion 2 Jhomara Luzuriaga
  • 36. JTable invoca un método del modelo de tabla para determinar eleditor/renderer predeterminado que utilizará para mostrar el valor de cada celda.Por ejemplo para celdas con valores booleanos utilizará check boxs; este métodoes: getColumnClass, y también es recomendable implementarlo: class MyTableModel extends AbstractTableModel { ... public Class getColumnClass(int c) { ... } }EjercicioCrear un proyecto ProyectoTablaSwing dentro del cual tendremos el paquetemodelo con las clases ModeloTablaEstudiante y Estudiante: Estudiante - id: int - nombre: String - apellido: String - carrera: String - modulo: String - paralelo: String - promedio: doubleAdicionalmente un paquete presentacion contiene la clase VentanaEstudiantesque será el frame con la tabla de estudiantes.Diseña una clase Ejecutable que permita crear 5 estudiantes y almacenarlos enun Vector de manera que se pueda crear el Modelo de la tabla con estos datos.  JTreeAl igual que JTable su creación se basa en un modelo que permite definir el nodoraíz y los nodos hoja del componente.Programacion 2 Jhomara Luzuriaga
  • 37. Algunos de sus constructores son:  JTree()  JTree(Object[] value) Retorna un JTree cuyos nodos hoja serán los objetos contenidos en el Array value.  JTree(TreeModel newModel) Crea una instancia de JTree en base al modelo del parámetro  JTree(TreeNode root) Crea un JTree con un nodo raíz TreeNode.  JTree(Vector<?> value) Crea un JTree con cada elemento especificado en el Vector como hijos de un nodo raíz que no es mostrado.TreeNode es la interfaz que permite generar los nodos del árbol, sin embargo porsu naturaleza no podemos crear objetos de ella. Existen algunas clases queimplementan esta interfaz y de las cuales podemos hacer uso.DefaultMutableTreeNodeEsta clase permite crear objetos TreeNode para añadirlos a un JTree; como esnecesario tener un Nodo principal crearemos primeramente éste y luegoañadiremos sus nodos hoja utilizando el constructor que recibe como parámetro elnombre del nodo:DefaultMutableTreeNode nodoPrincipal=new DefaultMutableTreeNode("Nodo Principal");DefaultMutableTreeNode nodo1=new DefaultMutableTreeNode("Nodo 1");DefaultMutableTreeNode nodoSub1=new DefaultMutableTreeNode("Nodo hijo 1");nodo1.add(nodoSub1);nodoPrincipal.add(nodo1);Programacion 2 Jhomara Luzuriaga
  • 38. Ahora crearemos el árbol con el nodo principal, utilizando el cuarto constructor delos antes mencionados:JTree arbol=new JTree(nodoPrincipal);EJERCICIOPara el ejercicio utilizaremos el Proyecto ComponentesAvanzados de modo quepodamos reutilizar la clase VentanaPrincipal para crear el frame que contendráun árbol con la clasificación de los animales.Programacion 2 Jhomara Luzuriaga
  • 39. 4. EVENTOS 4.1. ¿Qué es un evento?Todos los sistemas operativos están constantemente atendiendo a los eventosgenerados por los usuarios. Estos eventos pueden ser: pulsar una tecla, mover elratón, hacer clic con el ratón, pulsar el ratón sobre un botón o menú (Java distingueentre simplemente pulsar el ratón en un sitio cualquiera o hacerlo, por ejemplo, enun botón). El sistema operativo notifica a las aplicaciones que están ocurriendoestos eventos, y ellas deciden si han de responder o no de algún modo a esteevento. 4.2. Gestión de EventosPara hacer que el manejador escuche los eventos de otro objeto se emplea elmétodo add[nombre_evento]Listener.Programacion 2 Jhomara Luzuriaga
  • 40. Ejemplo: frame.addMouseListener(manejador);Este método permite registrar eventos del ratón asociados a un objeto frame.Esto se denomina Registro de Receptores específicos para los eventos. El objetofuente utiliza esta lista para notificar a cada receptor que ha sucedido un evento delos que controla.Hay algunas clases de eventos que involucran a más de un evento, tal es el casodel ratón. Por tanto, la clase que implementa el manejador de eventos del ratóndebe sobreescribir todos los métodos declarados en la interfaz MouseListener,tales como mousePressed, mouseReleased, mouseClicked, mouseMoved y otros.Para facilitar el manejo de estos eventos, se han definido un número de clasesintermedias, conocidas como clases adaptadores (Adapters), para no tener quesobreescribir todos los métodos de la interfaz cuando se requiere controlar un solotipo de evento.De esta manera podemos definir dos caminos para acceder a los Oyentes de loseventos para un componente específico:  Implementando la interfaz, lo cual implica sobreescribir todos sus métodos. public class EventoMouse implements MouseListener{...  Extendiendo una clase adaptadora, con lo cual se sobreescriben solo los métodos deseados. public class EventoMouse extends MouseAdapter{...Los eventos están agrupados de acuerdo a su naturaleza en los siguientes grupos:  ActionListener: acciones sobre componentes.  WindowListener: cierre o manipulación una ventana (Frame/Dialog).  MouseListener: presión de un botón del mouse mientras el cursor está sobre el componente.  MouseMotionListener: movimiento del mouse sobre un componente.  ComponentListener: visibilidad del componente.  FocusListener: obtención del foco del teclado.Programacion 2 Jhomara Luzuriaga
  • 41.  ListSelectionListener: selección de ítems dentro de una lista.A continuación en la siguiente se lista las principales interfaces junto a susrespectivas clases “Adapter” y los métodos que poseen para los componentes: Listener interface y Adapter MetodosActionListener actionPerformed(ActionEvent)AdjustmentListener adjustmentValueChanged(AdjustmentEvent)ComponentListener componentHidden(ComponentEvent)ComponentAdapter componentShown(ComponentEvent) componentMoved(ComponentEvent) componentResized(ComponentEvent)ContainerListener componentAdded(ContainerEvent)ContainerAdapter componentRemoved(ContainerEvent)FocusListener focusGained(FocusEvent)FocusAdapter focusLost(FocusEvent)KeyListener keyPressed(KeyEvent)KeyAdapter keyReleased(KeyEvent) keyTyped(KeyEvent)MouseListener mouseClicked(MouseEvent)MouseAdapter mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent)MouseMotionListener mouseDragged(MouseEvent)MouseMotionAdapter mouseMoved(MouseEvent)WindowListener windowOpened(WindowEvent)WindowAdapter windowClosing(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent)ItemListener itemStateChanged(ItemEvent)ListSelectionListener valueChanged(ListSelectionEvent)Ejemplo1. Vamos a trabajar con un evento que permite finalizar la ejecución del programa al momento de cerrar la VentanaBase, ya que de otro modo seguirá ejecutándose.Programacion 2 Jhomara Luzuriaga
  • 42. public class VentanaBase extends JFrame { public VentanaBase() { setTitle("Evento WindowClosing"); setSize(new Dimension(300, 200)); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JOptionPane.showMessageDialog(null,"El programa finalizara cuando pulse Aceptar"); System.exit(0); } }); } public static void main(String[] args) { new VentanaBase().setVisible(true); }}En el ejemplo añadimos un escuchador WindowListener al frame e implementamosel método windowClosing.2. Añadimos a la VentanaBase un botón salir para cerrar la Ventana mostrando un cuadro de confirmación. salir.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int opc=JOptionPane.showConfirmDialog(null,"Esta seguro de cerrar la Ventana"); if(opc==0){ System.exit(0); } } });Programacion 2 Jhomara Luzuriaga
  • 43. EjemploItemListenerItemListener es un manejador que escucha todos los eventos relacionados con laselección o cambio de algún ítem en un componente que implica selección.Vamos a crear una clase JFrame como la siguiente:Para manejar los eventos generados a partir de la selección de los ChekBox,construiremos una clase que implemente la interfaz ItemListener de manera quepodamos sobreescribir el método itemStateChanged (ItemEvent e)Trabajamos con la clase Font para cambiar el estilo de la Fuente del TextFieldprivate class CheckBoxListener implements ItemListener { private int valBold = Font.PLAIN; private int valItalic = Font.PLAIN; @Override public void itemStateChanged(ItemEvent e) { if (e.getSource() == bold) { if (e.getStateChange() == ItemEvent.SELECTED) { valBold = Font.BOLD; } else { valBold = Font.PLAIN; } } if (e.getSource() == italic) { if (e.getStateChange() == ItemEvent.SELECTED) { valItalic = Font.ITALIC; } else { valItalic = Font.PLAIN; } } ... ... }}Programacion 2 Jhomara Luzuriaga
  • 44. Añadimos el escuchador a los componentes del Frame (CheckBox):JCheckBox bold = new JCheckBox("Bold");JCheckBox italic = new JCheckBox("Italic");CheckBoxListener handler = new CheckBoxListener();bold.addItemListener(handler);bold.addItemListener(handler);Es el mismo objeto listener que añadimos a todos los CheckBox ya que es un soloobjeto el que va a recibir los eventos y va a realizar los cambios seleccionados.Ejemplo:MouseMotionListenerpublic class Ventana extends JFrame{ public Ventana(){ setTitle("Evento Mouse"); setSize(new Dimension(250, 150)); setLocationRelativeTo(null); final JPanel panel1=new JPanel(); panel1.setBackground(Color.gray); final JButton boton =new JButton("Boton"); boton.addMouseMotionListener(new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ boton.setCursor(new Cursor(Cursor.MOVE_CURSOR)); } }); panel1.add(boton); panel1.addMouseMotionListener(new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ panel1.setCursor(new Cursor(Cursor.HAND_CURSOR)); } }); this.add(panel1); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setVisible(true); }}Programacion 2 Jhomara Luzuriaga
  • 45. 5. GRÁFICOS EN SWINGTodos los contenedores en swing permiten ser redibujados (repaint) en tiempo deejecución, es decir añadir algún componente modificar posiciones, pintar sobre elcontenedor, etc. Esto se debe a que un contenedor swing deriva dejava.awt.Container, y de esta manera a sus métodos.Uno de ellos es el métodopaint(Graphics g)dibuja un gráfico (Graphics) en el contenedor. La clase Graphics permite diseñaralgunas formas como:Lineas drawLine(int x1, int y1, int x2, int y2) Dibuja una línea usando el color actual entre los puntos (x1, y1) y (x2, y2) en el sistema de coordenadas del graficoCirculos drawOval(int x, int y, int width, int height) Dibuja un óvalo en la posición x, y, el ancho y alto del círculo.Polígono drawPolygon(int[] xPoints, int[] yPoints, int nPoints) Dibuja un poligono cerrado definido por arreglos de (x, y) coordenadas.Rectángulo drawRect(int x, int y, int width, int height) Dibuja un rectángulo en (x, y) con su tamaño width, height. drawString(String str, int x, int y) Dibuja el texto del String srt usando el contexto actual del gráfico y el actual color de fuente.Para dibujar formas con relleno usa los métodos:  fill3DRect(int x, int y, int width, int height, boolean raised)  fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)  fillOval(int x, int y, int width, int height)Programacion 2 Jhomara Luzuriaga
  • 46.  fillPolygon(int[] xPoints, int[] yPoints, int nPoints)  fillRect(int x, int y, int width, int height)  fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)Ejemplo:g.fillOval(10,5, 4, 4);dibujará un óvalo relleno en un cuadrado de 4x4 en la posición (10,5) del contedordonde se dibuja.EJEMPLOJFrame Pintor:public class Pintor extends JFrame {private int cuentaPuntos = 0;private JLabel j=new JLabel("Van: "+cuentaPuntos+" puntos"); // arreglo de 2000 referencias a java.awt.Pointprivate Point puntos[] = new Point[ 2000 ]; // configurar GUI y registrar manejador de eventos de ratónpublic Pintor() {super( "Un programa simple de dibujo" );//crear una etiqueta y colocarla en la parte SOUTH del BorderLayoutgetContentPane().add( new JLabel( "Arrastre el ratón para dibujar" ),BorderLayout.SOUTH );getContentPane().add( j,BorderLayout.NORTH );addMouseMotionListener( new MouseMotionAdapter() { // clase interna anónima // almacenar coordenadas de arrastre y llamar a repaint public void mouseDragged( MouseEvent evento ) { if ( cuentaPuntos < puntos.length ) { puntos[ cuentaPuntos ] = evento.getPoint(); ++cuentaPuntos; repaint();Programacion 2 Jhomara Luzuriaga
  • 47. j.setText("Van: "+cuentaPuntos+" puntos, le quedan:" +(2000-cuentaPuntos)+"puntos"); } } } // fin de la clase interna anónima ); // fin de la llamada a addMouseMotionListener setSize( 400, 200 ); setVisible( true ); } // fin del constructor de Pintor// dibujar óvalo en un cuadro delimitador de 4x4 en ubicación especifica public void paint( Graphics g ){ super.paint( g ); // borra el área de dibujo for ( int i = 0; i < puntos.length && puntos[ i ] != null; i++ ) g.fillOval( puntos[ i ].x, puntos[ i ].y, 4, 4 ); } public static void main( String args[] ) { Pintor aplicacion = new Pintor(); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); }}Programacion 2 Jhomara Luzuriaga
  • 48. 6. GENERADOR DE INTERFACES DE NETBEANSEl IDE Netbeans permite crear interfaces gráficas de manera visual, es deciragregar a un Frame los componentes que deseamos tan solo con arrastrar elcomponente desde la paleta hasta el Frame y modificar sus propiedades.Para crear un Frame podemos seleccionar del Proyecto new JFrame en lugar deJava Class. De esta manera se creará una clase con algunos atributos ypropiedades de JFrame, incluyendo el método main que permitirá visualizar elFrame al ejecutar la clase.  VENTANAS DEL GENERADOR DE INTERFAZ GRÁFICAAl agregar un contenedor de JFrame a un proyecto el programa abre el formularioen una ficha del Editor con una barra de herramientas que incluye varios botones.El formulario se abre en la vista Diseño del generador de interfaces gráficas deusuario y aparecen automáticamente tres ventanas adicionales en las esquinas delprograma, que permiten navegar, organizar y editar los formularios de la interfazgráfica de usuario a medida que los genera.Las diferentes ventanas del generador de interfaces gráficas de usuarioincluyen:Programacion 2 Jhomara Luzuriaga
  • 49.  Área de diseño: Ventana principal del generador de interfaces gráficas de usuario para crear y editar formularios de interfaz gráfica de usuario de Java. Los botones Origen y Diseño de la barra de herramientas permiten ver el código fuente de una clase o la vista gráfica de sus componentes de la interfaz gráfica de usuario. Los botones adicionales de la barra de herramientas permiten acceder cómodamente a los comandos habituales, por ejemplo para elegir entre los modos de selección o conexión, alinear componentes, definir el comportamiento de cambio automático del tamaño de los componentes o pre visualizar los formularios.  Inspector: Proporciona una representación, tanto visual como no visual, de todos los componentes de la aplicación en forma de jerarquía de árbol. El inspector también permite visualizar el componente del árbol que se está editando en el generador de interfaces gráficas de usuario, así como organizar los componentes en los paneles disponibles.Programacion 2 Jhomara Luzuriaga
  • 50.  Paleta: Lista personalizable de los componentes disponibles que contiene fichas para los componentes de JavaBeans, JFC/Swing y AWT, así como administradores de diseño.  Ventana de propiedades: Muestra las propiedades del componente seleccionado en el generador de interfaces gráficas de usuario y las ventanas Inspector, Proyectos o Archivos.Método initComponents()El código del método initComponents() es generado al momento que se añadencomponentes al frame, es decir las propiedades y eventos que se agreguen a loscomponentes, de manera que no se pueden editar desde aquí.La única manera de modificar o aumentar código a éste método es mediante lapestaña Code del panel Properties en la vista diseño: Crear el componente Antes de crear el componente Después de crear el componente Para inicializar el valor del componente Después de inicializar el componente ..........Programacion 2 Jhomara Luzuriaga
  • 51. PRÁCTICA 1. Crear un proyecto denominado ProyectoSwing. 2. Crear una clase PrimerFrame en un paquete denominado presentacion. 3. Agregar los siguientes componentes y modificar sus propiedades de diseño:Diseño:  Asignamos nombres a cada componente:  Modificar el layout del panel Operaciones a BoxLayout  El cuadro de texto de Resultado no debe ser editable.  Agregamos los eventos a cada botón de las operaciones:Programacion 2 Jhomara Luzuriaga
  • 52. Una vez seleccionado el evento estaremos en la vista Source en donde está todo el código generado al agregar y modificar los componentes.  Modificamos el contenido del método actionPerformed de cada botón: El resultado será el siguiente:  Codificar los eventos de cada botón y controlar las excepciones para el ingreso de texto en los campos de número.EJERCICIO:Leer un archivo de texto desde un programa en java que permita leer y modificar elcontenido en un JTextArea.Utilice el patrón Modelo – Vista – Controlador para manejar los archivosProgramacion 2 Jhomara Luzuriaga
  • 53.  Uso de JFileChooser para buscar y abrir el archivo.  Uso de JFileColor para cambiar el color de fondo del área de texto y el color de fuente.  Uso del paquete java.io para la lectura y escritura del Archivo.EJERCICIO:Elabore un programa que permita administrar en una tabla (JTable) los datos de losestudiantes.  Utilizar el patrón MVC, de manera que la tabla pueda almacenar los estudiantes como objetos.  Trabajar los eventos que permiten actualizar los datos de la tabla al agregar, modificar o eliminar  Utilizar la opción binding de Netbeans para obtener los datos del Estudiante.Programacion 2 Jhomara Luzuriaga
  • 54. BIBLIOGRAFÍA 1. PÉREZ Gustavo Guillermo, Aprendiendo Java y Programación Orientada a Objetos. http://compunauta.com/forums/linux/programacion/java/ebook.html 2. DEITEL Paul. Como programar en Java 7/e. Pearson Education. 2007. 3. Micael Gallego & Soto Montalvo, Interfaces Gráficas en Java. Ramón Areces, 2005. http://gavab.escet.urjc.es/wiki/download/mp/material/Modulo- Ev-Tema2-1.pdf 4. PAVÓN GÓMEZ Santiago Dpto. Ingeniería Sistemas Telemáticos Univ. Politécnica de Madrid http://jungla.dit.upm.es/~santiago/docencia/apuntes/Swing/ 5. El tutorial Java de Sun: http://java.sun.com/docs/books/tutorial 6. Tutorial Java Básico Versión 3.0 http://www.javahispano.org 7. API Java de Sun (version 6): http://java.sun.com/javase/6/docs/apiProgramacion 2 Jhomara Luzuriaga

×