Download Práctica 1. Manejo de JFrames y Evetnos Competencia Específica a

Document related concepts
no text concepts found
Transcript
Práctica 1. Manejo de JFrames y Evetnos
Competencia Específica a Desarrollar: Desarrolla aplicaciones gráficas utilizando la API Swing de Java
utilizando manejo de eventos del teclado.
Saberes previos: conocer el funcionamiento básico de las clases JFrame, manejo de eventos en Java con
ActionListener así como el uso de componentes como JTextField, JButton y JLabel. Manejo de Herencia y
polimorfismo.
Saberes nuevos: JColorChooser.
Objetivo: Desarrollar una aplicación de ventanas en Java que permita calcular el área de las siguientes figuras:
Triángulo, Cuadrado, Círculo y Rectángulo. Se deberá manejar herencia de Figuras utilizando una clase base
Figura, la cual no podrá instanciarse, las clases derivadas no podrán derivar en otras. La aplicación cuenta con
una ventana principal en la que se escogerá el tipo de figura y mandará a cada ventana respectiva para
realizar el cálculo pertinente.
Nuevos saberes: A continuación se explica el código del día de hoy. El programa principal es el siguiente:
1. import java.awt.Color;
2. import javax.swing.JColorChooser;
3. public class App {
4. public static void main(String[] args) {
5. Color c=Color.BLACK;
6. c = JColorChooser.showDialog(null, "Escoge un color de fondo", c);
7. Principal p = new Principal("Ventana", 800, 600);
8. p.setBackground(c);
9. p.setVisible(true);
10. }
11. }
En la línea 6 se utiliza el Objeto estático JColorChooser del paquete javax.swing el cual es un cuadro de
diálogo para seleccionar colores. Este cuadro regresa el color seleccionado por el usuario el cual se colocará
de fondo en nuestra aplicación en la línea 8. El programa principal construye un objeto de tipo Principal que
a continuación se detalla:
1. import java.awt.BorderLayout;
2. import java.awt.Canvas;
3. import java.awt.Color;
4. import java.awt.Container;
5. import java.awt.Font;
6. import java.awt.GradientPaint;
7. import java.awt.Graphics;
8. import java.awt.Graphics2D;
9. import java.awt.event.ActionEvent;
10. import java.awt.event.ActionListener;
11. import java.awt.event.ItemEvent;
12. import java.awt.event.ItemListener;
13. import java.awt.event.MouseEvent;
14. import java.awt.event.MouseListener;
15. import java.awt.event.MouseMotionListener;
16. import java.awt.event.WindowEvent;
17. import java.awt.event.WindowListener;
18. import java.awt.geom.Ellipse2D;
19. import javax.swing.JButton;
20. import javax.swing.JCheckBox;
21. import javax.swing.JFrame;
22. import javax.swing.JLabel;
23. import javax.swing.JOptionPane;
24. import javax.swing.JPanel;
25. import javax.swing.JTextField;
26. import javax.swing.Timer;
27. public class Principal extends JFrame{
28. private int tamX;
29. private int tamY;
30. private String titulo;
31. private Lienzo l;
32. private Timer t;
33. private Font f;
34. private JTextField texto;
35. private JLabel etiqueta;
36. private JPanel p1, p2;
37. private JCheckBox caja;
38. private JButton boton;
39. public Principal(){
40. tamX=640;
41. tamY=480;
42. titulo="Venatana Principal";
43. init();
44. }
45. public Principal(String t, int x, int y){
46. super(t);
47. this.addWindowListener(new EventoVentana());
48. init();
49. setSize(x, y);
50. }
51. private void init(){
52. setDefaultLookAndFeelDecorated(true);
53. Container c = getContentPane();
54. c.setLayout(new BorderLayout());
55. p1 = new JPanel();
56. p1.setLayout(new BorderLayout());
57. p2 = new JPanel();
58. p2.setLayout(new BorderLayout());
59. l = new Lienzo();
60. l.addMouseMotionListener(new MovimientoRaton());
61. f = new Font("Helvetica", Font.BOLD, 32);
62. texto = new JTextField("Escribe tu nombre");
63. texto.setFont(f);
64. etiqueta = new JLabel("Ejemplo de manejo de eventos");
65. etiqueta.addMouseListener(new EventoRaton());
66. //etiqueta.addActionListener(new ActionListener(){
67. // public void actionPerformed(ActionEvent e) {
68. // System.out.println("Presionado");
69. //}
70. //});
71. p1.add(etiqueta, BorderLayout.NORTH);
72. p1.add(l, BorderLayout.CENTER);
73. p1.add(texto, BorderLayout.SOUTH);
74. //Se crea un timer cada 5 segundos
75. t = new Timer(5000, new ActionListener(){
76. public void actionPerformed(ActionEvent e){
a. System.out.println("Se repite cada 5 segundos");
77. }
78. });
79. //Se arranca el timer
80. t.start();
81. //t.stop();
82. caja = new JCheckBox("Te gusta Java");
83. caja.setSelected(true);
84. caja.addItemListener(new Verificacion());
85. boton = new JButton("Otra Ventana");
86. boton.addActionListener(new ActionListener(){
87. public void actionPerformed(ActionEvent e) {
a. Ventanita v = new Ventanita();
b. v.setVisible(true);
88. }
89. });
90. p2.add(caja, BorderLayout.NORTH);
91. p2.add(boton, BorderLayout.CENTER);
92. c.add(p1, BorderLayout.CENTER);
93. c.add(p2, BorderLayout.SOUTH);
94. pack();
95. }
96. class EventoRaton implements MouseListener{
97. public void mouseClicked(MouseEvent e) {
98. System.out.println("Se hizo click sobre la etiqueta con el boton="+e.getButton());
99. }
100.
public void mousePressed(MouseEvent e) {
101.
System.out.println("Se presiono el botón "+e.getClickCount()+"veces");
102.
}
103.
public void mouseReleased(MouseEvent e) {
104.
System.out.println("Se solto el boton en x="+e.getX());
105.
}
106.
public void mouseEntered(MouseEvent e) {
107.
System.out.println("Entro el raton"+e.getY());
108.
}
109.
public void mouseExited(MouseEvent e) {
110.
System.out.print("Se salio del raton a las:"+e.getWhen());
111.
}
112.
}
113.
class EventoVentana implements WindowListener{
114.
public void windowOpened(WindowEvent e) {
115.
//Evento de ventana abierta
116.
}
117.
public void windowClosing(WindowEvent e) {
118.
String opciones[]={"Si", "Tal vez", "A lo mejor", "Quien sabe", "No"};
119. int
op
=
JOptionPane.showOptionDialog(null,
"Deseas
salir",
JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, opciones, "No");
120.
System.out.println("Opcion seleccionada="+op );
121.
System.exit(-1);
122.
}
123.
public void windowClosed(WindowEvent e) {
124.
}
125.
public void windowIconified(WindowEvent e) {
126.
}
127.
public void windowDeiconified(WindowEvent e) {
128.
}
129.
public void windowActivated(WindowEvent e) {
"Saliendo",
130.
}
131.
public void windowDeactivated(WindowEvent e) {
132.
}
133.
}
134.
class MovimientoRaton implements MouseMotionListener{
135.
public void mouseDragged(MouseEvent e) {
136.
System.out.println("Se hizo Drag en el botón"+e.getLocationOnScreen());
137.
}
138.
public void mouseMoved(MouseEvent e) {
139.
System.out.println("Se movio el raton "+e.getPoint());
140.
}
141.
}
142.
class Verificacion implements ItemListener{
143.
public void itemStateChanged(ItemEvent e) {
144.
if(caja.isSelected())
a. System.out.println("Vientos!!!");
145.
else
a. System.out.println("De seguro eres fan de VB");
146.
}
147.
}
148.
}
149.
class Lienzo extends Canvas{
150.
@Override
151.
public void paint(Graphics g){
152.
Graphics2D g2d = (Graphics2D) g;
153.
int x[]={1, 100, 150, 200, 300};
154.
int y[]={1, 50, 200, 250, 300};
155.
g2d.fill3DRect(100, 350, 300, 100, true);
156.
g2d.drawPolygon(x, y, x.length);
157.
g2d.setPaint(new GradientPaint(5,30,Color.BLUE, 65,100, Color.YELLOW, true));
158.
g2d.fill(new Ellipse2D.Double(80,30, 65, 100));
159.
}
160.
}
La Ventana Principal tiene dos constructores uno predeterminado (línea 39) y otro parametrizado (línea
45). Ambos llaman al método init (línea 51) para la construcción del entrono gráfico.
El constructor parametrizado en la línea 47 agrega una manejador de eventos de ventana WindowListener
llamada EventoVentana (línea 113). De los eventos de ventana el más utilizado es windowClosing (línea
117) el cual ocurre cuando se cierra una ventana, en este caso en la línea 119 se muestra el uso del objeto
JOptionPane con el método showOptionDialog, este método recibe muchos parámetros conocidos,
cambiando un manejo de opción de botones a través de un arreglo de cadenas y la selección de un elemento
por default.
El método init en la línea 52 con setDefaultLookAndFeelDecorated(true), forza a que se conserve el
ambiente de ventanas predeterminado por el sistema. El manejo de componentes se hace a través de
Layouts anidados, todos de tipo BorderLayout. Para hacer el anidamieno de componentes se necesita de un
componente especial llamado JPanel. Un Panel permite colocar elementos para un mejor manejo. En este
programa se construyen dos paneles cuyo layout también es BorderLayout(líneas 53 a 58).
Aunque se puede dibujar directamente sobre cualquier componente gráfico con el método paint() se sugiere
que se utilice un objeto especializado para ello, este objeto es un Canvas. Se creó una clase llamada Lienzo
derivada de Canvas (línea 149) y se sobrescribió su método paint(). En la línea 152 se utilizó una mejora del
objeto Graphics tradicional: el objeto Graphics2D. Un objeto de tipo Grpahics2D tiene la misma
funcionalidad que Graphics solo que cuenta con métodos extendidos. En la línea 155 se construyo un
rectángulo lleno del color activo con efecto de 3D. En la línea 156 se dibujó un polígono con el método
drawPolygon, el cual recibe un conjunto de puntos x y y así como su tamaño. Mientras que en la línea 157 se
creó un gradiente entre azul y rojo (métodos solo disponibles en Grpahics2D) para después dibujar una
Elipse en dos dimensiones en la línea 158.
Una vez agregado el lienzo, se le agregó el manejo de eventos de tipo MouseMotionListener (línea 60) a
través de la clase Interna MovimientoRaton (línea 134). Este manejador de eventos cuenta con dos métodos:
mouseDragged y mouseMoved que se ejecutarán cuando sobre el lienzo se arrastre el ratón o éste se mueva.
En las líneas 66-70 las cuales están comentadas se trata de agregar un ActionListener a un JLabel. Dicho
evento no lo tiene definido este componente por lo que fue necesario agregar otro manejo de eventos. En
este caso nos interesa un clic de ratón lo cual se logra a través de agregar un manejador de eventos
MouseListener, por lo que se creo una clase manejadora del evento denominada EventoRatón(línea 96) que
controla los siguientes eventos: mouseClicked, mousePressed, mouseReleased, mouseEntered y
mouseExited. Se sobre cargo el método mouseClicked para simular un evento de acción.
En las líneas 71 a 73 se agregaron algunos componentes al panel1 para posteriormente agregarlos en un
contenedor. En la línea 75 se crea un timer, el cual es un elemento temporizador de reljo que ejecutará su
acción (definida en un ActionListener). El primer argumento es el número de milisegundos de espera, en
este caso 5000 equivalentes a 5 segundos. El timer se echa andar con el método start() y se pararía con el
método stop(). (Líneas 80 y 81).
En la línea 82 se crea una caja de verificación con JCheckBox, se coloca para que esté palomeada (línea 83) y
se agrega un manejador de eventos de tipo ItemListener llamado Verificación (línea 142). La cual
implementa el método itemStateChange el cual ocurre cuando cambia un valor.
Finalmente en las líneas 85 y 89 se crea un botón y se le asigna la propiedad de construir un objeto ventanita
que a continuación se describe:
1. import java.awt.Container;
2. import java.awt.FlowLayout;
3. import java.awt.event.ItemEvent;
4. import java.awt.event.ItemListener;
5. import javax.swing.ButtonGroup;
6. import javax.swing.JRadioButton;
7. import javax.swing.JFrame;
8. public class Ventanita extends JFrame implements ItemListener{
9. private JRadioButton op1, op2, op3;
10. private ButtonGroup grupo;
11. public Ventanita(){
12. super("Menú de Opciones");
13. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
14. Container c = getContentPane();
15. c.setLayout(new FlowLayout());
16. op1 = new JRadioButton("Opcion1", true);
17. op2 = new JRadioButton("Opcion2", false);
18. op3 = new JRadioButton("Opcion3", true);
19. c.add(op1);
20. c.add(op2);
21. c.add(op3);
22. grupo = new ButtonGroup();
23. grupo.add(op1);
24. grupo.add(op2);
25. grupo.add(op3);
26. op2.addItemListener(this);
27. }
28. public void itemStateChanged(ItemEvent e) {
29. System.out.println("Cambiando esta opcion");
30. System.out.print("opcion seleccionada="+grupo.getSelection().getActionCommand());
31. }
32. }
En este programa se construyen tres botones de radio con la clase JRadioButton (líneas 16 a 18) y se crea un
grupo de botones con ButtonGroup (línea 22) al cual lógicamente se le agregan los botones de forma lógica.
Nótese que si los radiobotones no estuvieran en un grupo, cada uno sería independiente con respecto a su
valor. Finalmente se agregó un manejador de evento de tipo ItemListener incluido dentro de la clase.