Вы находитесь на странице: 1из 54

1.

PROGRAMACIN GRFICA CON COMPONENTES SWING


Swing es una biblioteca grfica para Java. Incluye widgets para interfaz grfica de usuario. Una interfaz es lo que le permite a un usuario comunicarse con un programa a travs de componentes visuales como cajas de texto, botones, desplegables, tablas, etc. 1.1. COMPONENTE Un componente no es ms que un objeto que representa un elemento de una interfaz grfica y que en su mayora tienen una representacin grfica. Se puede dividir en dos tipos: 1. Simples o atmicos: Son los que no estn 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 grfica. Ejemplo: Frames, Applet. Contenedores intermedios: Permiten agrupar y organizar los componentes de una interfaz grfica dentro de un contenedor de alto nivel. Ejemplo: Paneles El patrn de desarrollo que utiliza SWING es MVC (Modelo Vista Controlador), que permite dividir una aplicacin en 3 partes: o Modelo: Datos o Vista: Interfaz grfica o Controlador: Permite manejar las interacciones del usuario con la interfaz grfica y a su vez manejar los cambios entre la vista y el modelo. 1.2. JERARQUA DE COMPONENTES Todos los componentes para el diseo de una interfaz grfica obedecen a una jerarqua de clases. La clase principal es java.awt.Component de la cual se heredan componentes como java.awt.Button, java.awt.Label, etc..., y tambin se hereda la clase java.awt.Container que representa a un objeto contenedor. Los componentes simples derivan de la clase JComponent, mientras los contenedores de la clase Window.

Programacion 2

Jhomara Luzuriaga

Container

Window Frame Dialog

JComponent

Panel Applet ..

AbstractButton ..

JTextComponent

..

JFrame

JDialog

JButton

JTextField

JTextArea

1.3. CONTENEDORES 1.3.1. Clase JFrame JAVA Frame es el componente, control u objeto principal de una aplicacion visual o grafica en java. Para crear un Frame deberemos crear una instancia de JFrame, y si deseamos modificar algunas propiedades de la ventana debemos crear una clase que extienda de JFrame. Ejemplo:
import javax.swing.*; class Frame extends JFrame { //el constuctor public Frame(){ //Este es uno de los mtodos que nuestra clase Frame ha //heredado de JFrame. Pone un ttulo a la ventana setTitle("Hola!!!"); //mtodo heredado que le da un tamao a la ventana setSize(300,200); setVisible(true); } }

Las ventanas JFrame son invisibles por defecto, se debe modificar la propiedad por defecto de JFrame de manera que nuestra ventana sea visible, para esto se sobreescribe el mtodo setVisible(true) con el parmetro true.
Programacion 2 Jhomara Luzuriaga

Algunos mtodos de JFrame son: setResizable(boolean): Permite hacer modificable el tamao de la ventana setState(int): Modificar el tamao de la ventana, recibe como parmetro un valor entero 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 un segundo componente enviado como parmetro. Para ubicar la ventana en el centro de la pantalla el parmetro deber ser null. EJERCICIO: Crear un proyecto DiseoVentanas 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 ttulo en cada una con el estado de la ventana. 1.3.2. Clase JDialog JDialog es un Componente que sirve para presentar dilogos que son ventanas auxiliares que se presentan cuando se registra un evento dentro de un programa, sirven para prevencin o en su defecto se puede utilizar para dar informacin sobre algo, los dilogos que JDialog muestra pueden ser modales o no modales, esto quiere decir que si son modales la ventana del dilogo bloquea las entradas a otras ventanas, este tipo de dilogos se pueden hacer tambin con JOptionPane. Todos los dilogos dependen de un frame, las modificaciones que se le hagan al frame afectaran a el dilogo, en caso de que el frame sea cerrado, minizado o maximizado, sus dilogos tendrn el mismo comportamiento Un JDialog siempre deber tener un componente Parent del cual se derive, que debe ser un contenedor de alto nivel y su efecto modal o no, de manera que cuando se crea una instancia de esta clase se deber establecer estos parmetros. Ejemplo:
Frame ventana= new Frame(); JDialog cuadroDialogo= new JDialog(ventana, true);

Programacion 2

Jhomara Luzuriaga

En este caso hemos creado un JDialog cuyo parent es un JFrame ventana. Los JDialog obedecen un evento, es decir se mostrarn cuando sobre el parent se realice algn evento que invoque la aparicin del JDialog. 1.3.3. Clase JPanel JPanel es un objeto de los llamados "contenedores". Es as porque sirven para contener otros objetos. Una de las ventajas de aadir paneles sobre nuestro frame es que los paneles al derivar de JComponent poseen el mtodo paintComponent que permite dibujar y escribir texto sobre el panel de modo sencillo. Para aadir un JPanel a nuestro frame primero obtenemos uno de los objetos que forman el frame: el panel contenedor (content pane). Para ello invocaremos al mtodo getContentPane de nuestro JFrame. El objeto que nos devuelve ser de tipo Container:
Container [nombre_del_contentpane] = frame.getContentPane();

A continuacin invocamos al mtodo add del Container obtenido para aadir el panel, pasndole el propio panel al mtodo:
[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(); //Aado 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

Para agregar componentes a un panel se utiliza el mtodo add: panel.add(new JButton(Click aqu)); Si no sealamos la ubicacin de los componentes en el panel, stos se ubican conforme se vayan aadiendo de manera horizontal, uno despus de otro en todo el ancho de la ventana. Para visualizar el Frame que hemos creado se aade a la clase el mtodo main dentro del cual se crear un objeto de nuestra clase Frame. La clase JFrame implementa la interfaz Runneable, la cual permite ejecutar y visualizar el Frame hasta que el usuario lo cancele.
public static void main(String[] args) { new Frame(); }

1.4. ALGUNOS COMPONENTES SIMPLES Todos los contenedores as como los componentes tienen propiedades que se pueden modificar mediante los mtodos de la clase que corresponden, as como sus respectivos constructores. Clase JLabel Es una etiqueta de texto que podemos colocar al lado de cualquier componente para darle una indicacin al usuario de cul es la funcin de dicho componente. Tambin se puede emplear a modo de ttulo. JLabel label = new JLabel("1 x 7 = 7");

Clases JTextArea, JTextPane y JTextField Son componentes bsicos del Swing de Java y su funcin principal es la de capturar texto ingresado desde teclado por el usuario. Clase JTextField Est pensado para obtener texto del usuario, este teclear en l y cuando pulse intro podremos disponer del texto que tecle. nicamente se puede recoger una lnea de texto.

Programacion 2

Jhomara Luzuriaga

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); } }

EJECUCIN

Clase JPasswordField Al igual que los anteriores permite al Usuario ingresar un texto que es reemplazado por un carcter que oculta lo que se escribe, por ejemplo: *. Se emplea para pedirle passwords al usuario y evitar que puedan ser ledas por alguien. Clase JButton Esta clase nos permite crear botones, cuya accin al pulsar ser programado con el manejo de eventos. Para crear un botn podemos utilizar los siguientes constructores: JButton() Crea un botn sin etiqueta JButton(String label) Crea un botn con una etiqueta de texto JButton t=new JButton(Derecha);

Programacion 2

Jhomara Luzuriaga

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 mtodos para cambiar el estado de un botn, una etiqueta y un cuadro de texto: ...... .. .. .. ...... .. .. .. ...... .. .. ..

Programacion 2

Jhomara Luzuriaga

Clase JComboBox Permite seleccionar un objeto (opcin) de una lista que se visualiza al dar click en la pestaa de este componente. Los constructores de la clase son: JComboBox(ComboBoxModel amodel); Requiere un objeto Modelo para el ComboBox JComboBox(Object [] items); Crea un combo, cuyos items correspondern al arreglo de objetos. JComboBox(Vector? items); Crea un combo, cuyos items correspondern 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 JCheckbox Se trata de un componente empleado para tomar informacin del usuario sobre cosas del tipo s, no. Dos de los constructores de un JCheckBox son: o JCheckBox(String) Crea un JCheckBox con etiqueta

Programacion 2

Jhomara Luzuriaga

o JCheckBox(String,boolean) Crea un JCheckBox con etiqueta y aparece seleccionado

Clase JRadioButton Dos 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 seleccionado Para utilizar este componente debe ser aadido a un grupo de manera que permita seleccionar una sola opcin entre las del grupo. Para ello se utiliza el componente ButtonGroup. 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 los componentes de la siguiente figura. El tamao del Frame ser de (260 x 250).

Programacion 2

Jhomara Luzuriaga

2. LAYOUT MANAGERS
2.1. Concepto El layout manager es el encargado de decidir en qu posiciones se renderizarn los componentes, que tamao tendrn, que porcin del contenedor abarcarn, 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 slo tendremos que llamar al mtodo: contenedor.setLayout(LayoutManager layout); Si en cualquier momento decidimos encargarnos nosotros mismos de la gestin de componentes tan slo tendremos que escribir: contenedor.setLayout(null); Cada componente de nuestro interfaz grfico tiene asignada una coordenada horizontal, una coordenada vertical, una longitud y una anchura determinadas. Estos valores sern los que se utilizarn para renderizar el componente en pantalla. La clase java.awt.Component nos ofrece una serie de mtodos para poder modificar los valores de los atributos anteriores: public void setSize(Dimension size); public void setBounds(Rectangle r);

2.2. Layout null Muchos deciden no utilizar layouts para ubicar los componentes de la ventana, en este caso el Layout se establece a Nulll y en el cdigo se decide la posicin de cada botn y qu tamao ocupa.
contenedor.setLayout(null); // Eliminamos el layout contenedor.add (boton); // Aadimos el botn boton.setBounds (10,10,40,20); // Botn en posicion 10,10 con ancho 40 pixels y alto 20

Esto, no es recomendable. Si se expande la ventana los componentes seguirn en su sitio, no se expandirn con la ventana. Si cambiamos de sistema operativo,
Programacion 2 Jhomara Luzuriaga

resolucin de pantalla o fuente de letra, los componentes no se visualizarn estticamente bien. 2.3. FlowLayout Es el que tienen los paneles por defecto. Los objetos se van colocando en filas en el mismo orden en que se aadieron al contenedor. Cuando se llena una fila se pasa a la siguiente. Tiene tres posibles constructores:
FlowLayout();

Crea el layout sin aadirle los componentes.


FlowLayout(FlowLayout.LEFT[RIGTH][CENTER]);

Indica la alineacin de los componentes: a la izquierda, derecha o centro.


FlowLayout(FlowLayout.LEFT, gap_horizontal,gap_vertical);

Adems de la alineacin de los componentes indica un espaciado (gap) entre los distintos componentes, de tal modo que no aparecen unos junto a otros. FlowLayout respeta siempre el tamao preferido de cada componente. Los componentes de cada fila se encuentran equiespaciados por un espacio de 5 puntos horizontal y verticalmente. Primero se establece el layout a utilizar, luego se aaden los componentes al panel.
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

JPanel panel = new JPanel(); JButton boton1 = new JButton("botn 1"); JButton boton2 = new JButton("Este es el botn 2"); JButton boton3 = new JButton("botn 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. BorderLayout Este layout distribuye los componentes en cinco zonas predeterminadas: son norte (NORTH), sur (SOUTH), este (EAST), oeste (WEST) y centro (CENTER). Si no especificamos ninguna regin por defecto el componente se inserta en el centro del contenedor.

Programacion 2

Jhomara Luzuriaga

Posee dos contructores:


BorderLayout(); BorderLayout(int gap_horizontal, int gap_vertical);

El segundo crear el layout dejando los espacios horizontales y verticales entre sus distintas zonas. Al momento de aadir componentes se debe especificar en el mtodo add la regin donde queremos aadir el componente: panel.add(componente_a_aadir, 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. GridLayout Distribuye los componentes de un contenedor en celdas y se ordenarn en el orden como sean aadidas, de izquierda a derecha y de arriba hacia abajo. El GridLayout es adecuado para hacer tableros, calculadoras en que todos los botones son iguales, etc.

Programacion 2

Jhomara Luzuriaga

Todas las cuadrculas sern del mismo tamao y crecern o se harn ms pequeas hasta ocupar toda el rea del contenedor. Hay dos posibles constructores: GridLayout(int filas, int columnas);
GridLayout(int gat_vertical); columnas, int filas, int gap_horizontal, int

Especifica espaciados verticales y horizontales entre las cuadrculas. 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

2.6. GridBagLayout El GridBagLayout es de los layouts ms verstiles y complejos de usar. Es como el GridLayout, pone los componentes en forma de matriz (cuadrcula), pero permite que las celdas y los componentes en ellas tengan tamaos 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 proporcin podemos decidirla

GridBagConstraints es una clase en cuyos atributos se guarda informacin de cmo y dnde aadir el componente. GridBagConstraints.gridx nos dice la posicin x del componente, es decir, el nmero de columna en la que est el componente, siendo la columna 0 la primera columna de la izquierda. GridBagConstraints.gridy nos dice la posicin y del componente, es decir, el nmero 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=0

c.gridx=0, c.gridy=0

c.gridx=0, c.gridy=1 c.gridx=1, c.gridy=1 c.gridx=2, c.gridy=0


Programacion 2 Jhomara Luzuriaga

GridBagConstraints.gridwidth nos dice cuntas 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 nmero cardinal, en este caso indica exactamente el nmero 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.gridheigth=1

c.gridwidth=GridBagCostraints.REMAINDER c.gridheigth=1

c.gridwidth=1 c.gridheigth=1

c.gridwidth=GridBagCostraints.RELATIVE c.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 alineacin del componente, se utiliza cuando el ste es ms pequeo que el rea utilizada: NORTH, SOUTH, EAST, WEAST, NORTHWEST,
SOUTHWEST, NORTHEAST, SOUTHEAST y CENTER.

Programacion 2

Jhomara Luzuriaga

Fill establece el relleno de la celda: HORIZONTAL, VERTICAL, BOTH, NONE

En este caso las celdas ocupan todo el contenedor, pero eso es debido a que se ha utilizado los atributos weightx y weighty. weightx y weighty Los atributos weightx y weighty especifican el porcentaje de espacio libre que ocupar una celda determinada. En el ejemplo anterior si no utilizamos estos atributos tendramos:

Programacion 2

Jhomara Luzuriaga

Este espacio libre (flechas verdes) se dividir entre todas las celdas que especifiquen valores dentro de los atributos weightx y weighty. La forma de especificar el espacio que quiere ocupar cada componente es mediante un nmero entre 0.0 y 1.0. Este nmero representa al porcentaje de espacio libre que ocupar cada celda.

Insets El 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

Los parmetros del constructor especifican el espacio que se dejar de mrgen. 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 parmetros para cada uno de los componentes. c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = GridBagConstraints.RELATIVE; Programacion 2 Jhomara Luzuriaga

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("Contrasea"), 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. BoxLayout Este layout manager es uno de los ms sencillos y de los ms tiles. Aqu los componentes son agrupados horizontal o verticalmente dentro del contenedor que los contiene. Los componentes no se solapan de ningn modo. La anidacin de paneles utilizando este layout manager nos puede permitir crear interfaces muy complejos como nos permite GridBagLayout pero a costa de la creacin de objetos pesados como son paneles. El constructor de BoxLayout es muy simple: public BoxLayout(Container objetivo, int eje); Donde el parmetro 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 lnea. Para ello se tiene en cuenta la propiedad ComponentOrientation del contenedor. Si esta propiedad es horizontal entonces los componentes se organizarn

Programacion 2

Jhomara Luzuriaga

horizontalmente y adems segn su valor lo harn de izquierda a derecha o de derecha a izquierda. En otro caso se organizarn verticalmente de arriba a abajo. PAGE_AXIS, los componentes se organizan como si estuvieran en una pgina. Para ello se tiene en cuenta la propiedad ComponentOrientation del contenedor.

Los componentes se organizan en el orden en el que se aaden al contenedor. En el caso de organizacin horizontal, BoxLayout intentar que todos los componentes del contenedor tengan la misma altura, siendo esta la mxima de los elementos del contenedor. En caso de que no sea posible, BoxLayout intentar alinearlos a todos horizontalmente de modo que sus centros coincidan en una lnea horizontal imaginaria que los atraviese, de manera similar, si la organizacin es vertical. A menudo, en lugar de utilizar BoxLayout directamente, se utiliza la clase Box que es un contenedor ligero que tiene como layout manager un BoxLayout y que ofrece mtodos 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("Botn nmero " + i)); panel2.add(new JButton("Botn nmero " + 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

2.8. SpringLayout Este layout manager est nicamente disponible a partir de la versin 1.4 del JDK. SpringLayout define los componentes que estarn dentro del interfaz y la relacin entre estos componentes, es decir, el espacio que habr entre ellos. SpringLayout intentar respetar siempre que pueda el tamao preferido de los componentes. El espacio entre los componentes se define utilizando objetos Spring. Cada objeto Spring tiene cuatro propiedades, sus tamaos mximo, mnimo y preferido junto con su tamao actual. (x, y, width, height) Todos estos objetos Spring se acumulan formando un conjunto de restricciones que estarn en un objeto de tipo SpringLayout.Constraints. Para crear un objeto Spring: Spring.constant(min, pref, max); Spring.constant(int valor); El mtodo para ubicar un componente aplicando constraint tespecto de otro: putConstraint(borde, componente, constraint, borde, componenteRelativo);

Programacion 2

Jhomara Luzuriaga

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 lblContrasea=new JLabel("Contrasea"); JTextField txtUsuario=new JTextField(10); JTextField txtContrasea=new JTextField(10); container.add(lblUsuario); container.add(txtUsuario); container.add(lblContrasea); container.add(txtContrasea); 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, lblContrasea, Spring.constant(30),SpringLayout.WEST,container); sl.putConstraint(SpringLayout.NORTH, lblContrasea, Spring.constant(25),SpringLayout.NORTH,lblUsuario); sl.putConstraint(SpringLayout.WEST,txtContrasea, Spring.constant(15),SpringLayout.EAST,lblContrasea); sl.putConstraint(SpringLayout.NORTH, txtContrasea, 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

EJERCICIO: Disee la siguiente pantalla utilizando el Layout ms indicado para la ubicacin de los componentes en el Frame

Programacion 2

Jhomara Luzuriaga

3. ALGUNOS COMPONENTES COMPLEJOS


3.1. Componentes contenedores de otros. Clase JMenuBar Es una barra de mens, en ella se pueden aadir los siguientes componentes: Clase JMenu: Es una opcin de la cual se pueden desplegar mas opciones. Clase JMenuItem: Es una opcin final (no desplega mas opciones)
JMenu JMenuBar

JMenuItem

EJEMPLO:
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

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 JScrollPane Es un panel que permite visualizar un componente de un tamao mayor que el disponible, mediante el uso de barras de desplazamiento.

Como su nombre lo indica, funciona como un contenedor, de manera que podemos agregar 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

Clase JSplitPane Permite visualizar dos componentes, uno a cada lado, con la posibilidad de modificar la cantidad de espacio otorgado a cada uno. Se puede agregar un contenedor como un JPanel en cada lado del Split y este a su vez contener ms componentes. Adems se puede modificar una propiedad que indica la disposicin de los componentes: horizontal o vertical.

//espacio del primer componente con respecto del segundo split.setDividerLocation(150); //separacin entre componentes del Split split.setDividerSize(20); //cambiando el componente de la izquierda y derecha split.setLeftComponent(componenteIzquierda); split.setRightComponent(componenteDerecha);

EJERCICIO: SPLITPANE Y SCROLLPANE

Ubicar el primer componente con mayor ventaja que el segundo, con respecto al tamao del contenedor principal y una divisin de 20pix.

Programacion 2

Jhomara Luzuriaga

Clase JTabbedPane Permite definir varias hojas con pestaas, que pueden contener otros componentes. El componente bsico de cada hoja debe ser un Panel que es el que agrupe el resto de componentes. Para agregar ms hojas basta con aadir 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 se pueden crear a partir de un modelo de datos. Por ejemplo un componente sencillo como el JComboBox contiene un arreglo de objetos. 3.2.1. JLIST Un componente JList permite administrar una lista de elementos de tipo Object con una representacin en String Los 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 interface utilizaremos una clase que la implementa: DefaultListModel

Programacion 2

Jhomara Luzuriaga

DefaultListModel modeloLista=new DefaultListModel(); Un objeto de esta clase puede implementar el mtodo addElement(Object o). modeloLista.addElement(Elemento1);//Object d e 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

EJERCICIO Crear un Proyecto denominado ComponentesAvanzados y dentro del paquete ventanas disear un clase VentanaPrincipal que extienda de JFrame y que tenga los constructores necesarios para modificar sus propiedades. Crear una clase ComponenteLista que permita utilizar la VentanaPrincipal para aadir un JList similar al ejemplo, que contenga la lista de 5 estudiantes del saln.

3.2.2. JTABLE JTable es uno de los componentes con APIs ms extensas y tambin son complejos, esa complejidad le permite ser ms 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, el segundo crea la tabla como una matrz de numRows x numColumns. Vamos a ver un ejemplo utilizando el constructor, que permite crear una tabla con una matriz de datos (rowData) y los nombres de las columnas contenidos en un array de String.

Nuestro primer ejemplo tendr las siguientes columnas:


String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos de Practica", "Soltero(a)"};

Y utilizaremos el siguiente array para su contenido:

Programacion 2

Jhomara Luzuriaga

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", "Daz", "Nadar", new Integer(4), new Boolean(false)}};

La creacin de una tabla con estos datos sera:


JTable table = new JTable(data, columnNames);

Ejemplo:
import import import import import java.awt.BorderLayout; java.awt.Dimension; javax.swing.JFrame; javax.swing.JScrollPane; 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", "Daz", "Nadar", new Integer(4), new Boolean(false)}}; //array de String's con los ttulos de las columnas String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos 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 JTable

Programacion 2

Jhomara Luzuriaga

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 tabla Los modelos de tabla son objetos que implementan la interface TableModel; a travs de ellos es posible personalizar mucho ms y mejor el comportamiento de los componentes JTable, permitiendo utilizar al mximo sus potencialidades. Todas las tablas cuentan con un modelo de tabla, aunque en el ejemplo 1 no se haya especificado, existe uno por omisin La clase AbstractTableModel es la que implementa directamente a la interface TableModel, aunque es esta clase la que se recomienda extender para utilizarla como modelo de tabla, existe un modelo de tabla predeterminado que facilita mucho el trabajo con tablas. Este modelo predeterminado es la clase DefaultTableModel DefaultTableModel Esta clase tiene el siguiente diagrama de herencia:
java.lang.Object | +-javax.swing.table.AbstractTableModel | +-javax.swing.table.DefautTableModel

Nuevamente, antes de comenzar a utilizar esta clase, veremos cuales son los 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

Utilizaremos el constructor que nos permite crear un DefaultTableModel, a partir de los 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 crea la tabla con el constructor correspondiente:
JTable table = new JTable(dtm);

Una vez hecho esto, cualquier modificacin que se realice sobre el modelo de tabla se reflejar directamente en la tabla. Agregar una columna:
String[] newColumn= {"Contabilidad", "Informatica", "Medicina", "Musica", "Diseo"}; dtm.addColumn("Carrera",newColumn);

Agregar una fila:


Object[] newRow={"Jose", "Ordez", "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 mtodos que proporciona la clase DefaultTableModel para conocer qu otras cosas puedes realizar con ella. Ejemplo
import import import import import javax.swing.JTable; javax.swing.table.DefaultTableModel; javax.swing.JScrollPane; javax.swing.JPanel; 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

{"Kthya","Espinoza", "Escalar", new Integer(2), new Boolean(false)}, {"Marco", "Molina", "Correr", new Integer(7), new Boolean(true)}, {"Angela","Daz", "Nadar", new Integer(4), new Boolean(false)}}; //array de String's con los ttulos de las columnas String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos 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", "Diseo" }; dtm.addColumn("Carrera",newColumn); //filas Object[] newRow={"Jos", "Ordez", "Tenis", new Integer(5), new Boolean(false), "Informatica"}; dtm.addRow(newRow); //o modificar una celda en especifico dtm.setValueAt("Sofa", 1, 1); //se define el tamao 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); } }

AbstractTableModel

Con esta clase es posible implementar, de una manera ms completa y eficiente, los mtodos necesarios para crear un modelo de tabla. Para crear un modelo de tabla personalizado, lo primero que necesitamos es extender la clase AbstractTableModel.
class MyTableModel extends AbstractTableModel { ..... }

Como es una clase Abstracta debemos de implementar los 3 mtodos siguientes:

Programacion 2

Jhomara Luzuriaga

class MyTableModel extends AbstractTableModel { public int getRowCount(){ ... } public int getColumnCount(){ ... } public Object getValueAt(int row, int column){ ... } }

Con la implementacin de los mtodos anteriores, las celdas de la tabla NO sern editables y NO se podrn modificar los valores de cada una de ellas. Si deseamos tener un mecanismo para modificar los valores de las celdas de la tabla, tenemos que sobrescribir el mtodo setValueAt de la clase AbstractTableModel:
class MyTableModel extends AbstractTableModel { ... ... public void setValueAt(Object value, int row, int col) { ... } }

Y, si la modificacin de los valores de las celdas, se hace directamente sobre ellas, necesitamos indicar a nuestro modelo de tabla que las celdas de la tabla sern editables, esto se hace sobrescribiendo el mtodo isCellEditable:
class MyTableModel extends AbstractTableModel { ... public boolean isCellEditable(int row, int col) { ... } }

Ya lo nico que hara falta sera agregar los nombres de las columnas de nuestra tabla y definir su contenido inicial:
class MyTableModel extends AbstractTableModel { final String[] columnNames = { ... } final Object[][] data = { ... } ... }

Programacion 2

Jhomara Luzuriaga

JTable invoca un mtodo del modelo de tabla para determinar el editor/renderer predeterminado que utilizar para mostrar el valor de cada celda. Por ejemplo para celdas con valores booleanos utilizar check box's; este mtodo es: getColumnClass, y tambin es recomendable implementarlo:
class MyTableModel extends AbstractTableModel { ... public Class getColumnClass(int c) { ... } }

Ejercicio Crear un proyecto ProyectoTablaSwing dentro del cual tendremos el paquete modelo con las clases ModeloTablaEstudiante y Estudiante:
Estudiante - id: int - nombre: String - apellido: String - carrera: String - modulo: String - paralelo: String - promedio: double

Adicionalmente un paquete presentacion contiene la clase VentanaEstudiantes que ser el frame con la tabla de estudiantes. Disea una clase Ejecutable que permita crear 5 estudiantes y almacenarlos en un Vector de manera que se pueda crear el Modelo de la tabla con estos datos.

JTree Al igual que JTable su creacin se basa en un modelo que permite definir el nodo raz y los nodos hoja del componente.

Programacion 2

Jhomara Luzuriaga

Algunos de sus constructores son:


JTree() JTree(Object[] value)

Retorna un JTree cuyos nodos hoja sern los objetos contenidos en el Array value.
JTree(TreeModel newModel)

Crea una instancia de JTree en base al modelo del parmetro


JTree(TreeNode root)

Crea un JTree con un nodo raz TreeNode.


JTree(Vector<?> value)

Crea un JTree con cada elemento especificado en el Vector como hijos de un nodo raz que no es mostrado. TreeNode es la interfaz que permite generar los nodos del rbol, sin embargo por su naturaleza no podemos crear objetos de ella. Existen algunas clases que implementan esta interfaz y de las cuales podemos hacer uso. DefaultMutableTreeNode Esta clase permite crear objetos TreeNode para aadirlos a un JTree; como es necesario tener un Nodo principal crearemos primeramente ste y luego aadiremos sus nodos hoja utilizando el constructor que recibe como parmetro el nombre 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

Ahora crearemos el rbol con el nodo principal, utilizando el cuarto constructor de los antes mencionados:
JTree arbol=new JTree(nodoPrincipal);

EJERCICIO

Para el ejercicio utilizaremos el Proyecto ComponentesAvanzados de modo que podamos reutilizar la clase VentanaPrincipal para crear el frame que contendr un rbol con la clasificacin de los animales.

Programacion 2

Jhomara Luzuriaga

4. EVENTOS
4.1. Qu es un evento? Todos los sistemas operativos estn constantemente atendiendo a los eventos generados por los usuarios. Estos eventos pueden ser: pulsar una tecla, mover el ratn, hacer clic con el ratn, pulsar el ratn sobre un botn o men (Java distingue entre simplemente pulsar el ratn en un sitio cualquiera o hacerlo, por ejemplo, en un botn). El sistema operativo notifica a las aplicaciones que estn ocurriendo estos eventos, y ellas deciden si han de responder o no de algn modo a este evento. 4.2. Gestin de Eventos

Para hacer que el manejador escuche los eventos de otro objeto se emplea el mtodo add[nombre_evento]Listener.

Programacion 2

Jhomara Luzuriaga

Ejemplo: frame.addMouseListener(manejador); Este mtodo permite registrar eventos del ratn asociados a un objeto frame. Esto se denomina Registro de Receptores especficos para los eventos. El objeto fuente utiliza esta lista para notificar a cada receptor que ha sucedido un evento de los que controla. Hay algunas clases de eventos que involucran a ms de un evento, tal es el caso del ratn. Por tanto, la clase que implementa el manejador de eventos del ratn debe sobreescribir todos los mtodos declarados en la interfaz MouseListener, tales como mousePressed, mouseReleased, mouseClicked, mouseMoved y otros. Para facilitar el manejo de estos eventos, se han definido un nmero de clases intermedias, conocidas como clases adaptadores (Adapters), para no tener que sobreescribir todos los mtodos de la interfaz cuando se requiere controlar un solo tipo de evento. De esta manera podemos definir dos caminos para acceder a los Oyentes de los eventos para un componente especfico: Implementando la interfaz, lo cual implica sobreescribir todos sus mtodos.
public class EventoMouse implements MouseListener{...

Extendiendo una clase adaptadora, con lo cual se sobreescriben solo los mtodos deseados.
public class EventoMouse extends MouseAdapter{...

Los eventos estn agrupados de acuerdo a su naturaleza en los siguientes grupos: ActionListener: acciones sobre componentes. WindowListener: cierre o manipulacin una ventana (Frame/Dialog). MouseListener: presin de un botn del mouse mientras el cursor est sobre el componente. MouseMotionListener: movimiento del mouse sobre un componente. ComponentListener: visibilidad del componente. FocusListener: obtencin del foco del teclado.

Programacion 2

Jhomara Luzuriaga

ListSelectionListener: seleccin de tems dentro de una lista.

A continuacin en la siguiente se lista las principales interfaces junto a sus respectivas clases Adapter y los mtodos que poseen para los componentes:
Listener interface y Adapter ActionListener AdjustmentListener ComponentListener ComponentAdapter Metodos actionPerformed(ActionEvent) adjustmentValueChanged(AdjustmentEvent) componentHidden(ComponentEvent) componentShown(ComponentEvent) componentMoved(ComponentEvent) componentResized(ComponentEvent) componentAdded(ContainerEvent) componentRemoved(ContainerEvent) focusGained(FocusEvent) focusLost(FocusEvent) keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseDragged(MouseEvent) mouseMoved(MouseEvent) windowOpened(WindowEvent) windowClosing(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) itemStateChanged(ItemEvent) valueChanged(ListSelectionEvent)

ContainerListener ContainerAdapter FocusListener FocusAdapter KeyListener KeyAdapter MouseListener MouseAdapter

MouseMotionListener MouseMotionAdapter WindowListener WindowAdapter

ItemListener ListSelectionListener

Ejemplo 1. Vamos a trabajar con un evento que permite finalizar la ejecucin del programa al momento de cerrar la VentanaBase, ya que de otro modo seguir ejecutndose.

Programacion 2

Jhomara Luzuriaga

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 finalizara cuando pulse Aceptar"); System.exit(0); } }); } public static void main(String[] args) { new VentanaBase().setVisible(true); }

programa

} En el ejemplo aadimos un escuchador WindowListener al frame e implementamos el mtodo windowClosing. 2. Aadimos a la VentanaBase un botn salir para cerrar la Ventana mostrando un cuadro de confirmacin.
salir.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int opc=JOptionPane.showConfirmDialog(null,"Esta cerrar la Ventana"); if(opc==0){ System.exit(0); } } });

seguro

de

Programacion 2

Jhomara Luzuriaga

Ejemplo ItemListener ItemListener es un manejador que escucha todos los eventos relacionados con la seleccin o cambio de algn tem en un componente que implica seleccin. Vamos a crear una clase JFrame como la siguiente:

Para manejar los eventos generados a partir de la seleccin de los ChekBox, construiremos una clase que implemente la interfaz ItemListener de manera que podamos sobreescribir el mtodo itemStateChanged (ItemEvent e) Trabajamos con la clase Font para cambiar el estilo de la Fuente del TextField
private 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

Aadimos 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 aadimos a todos los CheckBox ya que es un solo objeto el que va a recibir los eventos y va a realizar los cambios seleccionados. Ejemplo: MouseMotionListener
public 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

5. GRFICOS EN SWING
Todos los contenedores en swing permiten ser redibujados (repaint) en tiempo de ejecucin, es decir aadir algn componente modificar posiciones, pintar sobre el contenedor, etc. Esto se debe a que un contenedor swing deriva de java.awt.Container, y de esta manera a sus mtodos. Uno de ellos es el mtodo
paint(Graphics g)

dibuja un grfico (Graphics) en el contenedor. La clase Graphics permite disear algunas formas como: Lineas
drawLine(int x1, int y1, int x2, int y2)

Dibuja una lnea usando el color actual entre los puntos (x1, y1) y (x2, y2) en el sistema de coordenadas del grafico Circulos
drawOval(int x, int y, int width, int height)

Dibuja un valo en la posicin x, y, el ancho y alto del crculo. Polgono


drawPolygon(int[] xPoints, int[] yPoints, int nPoints)

Dibuja un poligono cerrado definido por arreglos de (x, y) coordenadas.

Rectngulo drawRect(int x,

int y,

int width,

int height)

Dibuja un rectngulo en (x, y) con su tamao width, height.


drawString(String str, int x, int y)

Dibuja el texto del String srt usando el contexto actual del grfico y el actual color de fuente.

Para dibujar formas con relleno usa los mtodos: 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

fillPolygon(int[] xPoints, int[] yPoints, int nPoints) fillRect(int x, int y, int width, int height) fillRoundRect(int x, int arcHeight) int y, int width, int height, int arcWidth,

Ejemplo:
g.fillOval(10,5, 4, 4);

dibujar un valo relleno en un cuadrado de 4x4 en la posicin (10,5) del contedor donde se dibuja. EJEMPLO JFrame 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.Point private Point puntos[] = new Point[ 2000 ]; // configurar GUI y registrar manejador de eventos de ratn public Pintor() { super( "Un programa simple de dibujo" ); //crear una etiqueta y colocarla en la parte SOUTH del BorderLayout getContentPane().add( new JLabel( "Arrastre el ratn para dibujar" ), BorderLayout.SOUTH ); getContentPane().add( j,BorderLayout.NORTH ); addMouseMotionListener( new MouseMotionAdapter() { // clase interna annima // 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

j.setText("Van: "+cuentaPuntos+" puntos, le quedan:" +(2000-cuentaPuntos)+"puntos"); } } } // fin de la clase interna annima ); // 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 ubicacin 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

6. GENERADOR DE INTERFACES DE NETBEANS


El IDE Netbeans permite crear interfaces grficas de manera visual, es decir agregar a un Frame los componentes que deseamos tan solo con arrastrar el componente desde la paleta hasta el Frame y modificar sus propiedades. Para crear un Frame podemos seleccionar del Proyecto new JFrame en lugar de Java Class. De esta manera se crear una clase con algunos atributos y propiedades de JFrame, incluyendo el mtodo main que permitir visualizar el Frame al ejecutar la clase.

VENTANAS DEL GENERADOR DE INTERFAZ GRFICA

Al agregar un contenedor de JFrame a un proyecto el programa abre el formulario en una ficha del Editor con una barra de herramientas que incluye varios botones. El formulario se abre en la vista Diseo del generador de interfaces grficas de usuario y aparecen automticamente tres ventanas adicionales en las esquinas del programa, que permiten navegar, organizar y editar los formularios de la interfaz grfica de usuario a medida que los genera. Las diferentes ventanas del generador de interfaces grficas de usuario incluyen:

Programacion 2

Jhomara Luzuriaga

rea de diseo: Ventana principal del generador de interfaces grficas de usuario para crear y editar formularios de interfaz grfica de usuario de Java. Los botones Origen y Diseo de la barra de herramientas permiten ver el cdigo fuente de una clase o la vista grfica de sus componentes de la interfaz grfica de usuario. Los botones adicionales de la barra de herramientas permiten acceder cmodamente a los comandos habituales, por ejemplo para elegir entre los modos de seleccin o conexin, alinear componentes, definir el comportamiento de cambio automtico del tamao de los componentes o pre visualizar los formularios.

Inspector: Proporciona una representacin, tanto visual como no visual, de todos los componentes de la aplicacin en forma de jerarqua de rbol. El inspector tambin permite visualizar el componente del rbol que se est editando en el generador de interfaces grficas de usuario, as como organizar los componentes en los paneles disponibles.
Jhomara Luzuriaga

Programacion 2

Paleta: Lista personalizable de los componentes disponibles que contiene fichas para los componentes de JavaBeans, JFC/Swing y AWT, as como administradores de diseo. Ventana de propiedades: Muestra las propiedades del componente seleccionado en el generador de interfaces grficas de usuario y las ventanas Inspector, Proyectos o Archivos.

Mtodo initComponents() El cdigo del mtodo initComponents() es generado al momento que se aaden componentes al frame, es decir las propiedades y eventos que se agreguen a los componentes, de manera que no se pueden editar desde aqu.

La nica manera de modificar o aumentar cdigo a ste mtodo es mediante la pestaa Code del panel Properties en la vista diseo:

Crear el componente Antes de crear el componente Despus de crear el componente Para inicializar el valor del componente Despus de inicializar el componente ..........

Programacion 2

Jhomara Luzuriaga

PRCTICA 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 diseo:

Diseo: 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 botn de las operaciones:

Programacion 2

Jhomara Luzuriaga

Una vez seleccionado el evento estaremos en la vista Source en donde est todo el cdigo generado al agregar y modificar los componentes.

Modificamos el contenido del mtodo actionPerformed de cada botn:

El resultado ser el siguiente:

Codificar los eventos de cada botn y controlar las excepciones para el ingreso de texto en los campos de nmero.

EJERCICIO: Leer un archivo de texto desde un programa en java que permita leer y modificar el contenido en un JTextArea. Utilice el patrn Modelo Vista Controlador para manejar los archivos

Programacion 2

Jhomara Luzuriaga

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 los estudiantes. Utilizar el patrn 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 opcin binding de Netbeans para obtener los datos del Estudiante.
Jhomara Luzuriaga

Programacion 2

BIBLIOGRAFA 1. PREZ Gustavo Guillermo, Aprendiendo Java y Programacin 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 Grficas en Java. Ramn Areces, 2005. http://gavab.escet.urjc.es/wiki/download/mp/material/ModuloEv-Tema2-1.pdf 4. PAVN GMEZ Santiago Dpto. Ingeniera Sistemas Telemticos Univ. Politcnica 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 Bsico Versin 3.0 http://www.javahispano.org 7. API Java de Sun (version 6): http://java.sun.com/javase/6/docs/api

Programacion 2

Jhomara Luzuriaga

Вам также может понравиться