2025-05-12-Programacion - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Tema 11 - Repaso interfaces gráficas escritorio
Y listos. ¿Queréis alguna cosilla que comentemos antes de arrancar?
00:00:02
La última clase antes de la semana que viene.
00:00:08
La semana que viene estáis metidos en plena faena de exámenes, ya desde el viernes creo.
00:00:11
No sé si tendréis vosotros en particular algún examen el viernes, pero ya empiezan.
00:00:16
Y luego toda la semana que viene, no sé si hasta el jueves siguen los exámenes,
00:00:21
con lo cual la semana que viene se suspenden las clases normales.
00:00:26
y ya el siguiente lunes, como ya habréis hecho
00:00:29
el examen de la ordinaria, no sé exactamente
00:00:34
qué día nos pondrán las juntas de evaluación. Si nos ponen juntas de evaluación el lunes
00:00:38
no podría estar claro en los dos sitios, pero no sé qué día nos lo van a poner. Os iré
00:00:42
comunicando si estoy disponible o no en función
00:00:45
de las tareas que nos vayan poniendo aquí en el centro para la tutoría
00:00:50
no de la semana que viene, sino de la siguiente. Y en cualquier
00:00:54
claso probablemente lo que haríamos sería
00:00:58
pues habilitar la posibilidad de que
00:01:00
vengáis a ver el examen por aquí por
00:01:02
el centro para ese lunes
00:01:03
y para hoy pues un poquito
00:01:05
si tenéis alguna duda intentamos
00:01:09
abordarla en primer lugar
00:01:11
y si no pues os cuento un poquito
00:01:13
pues como hacer algunas cositas con
00:01:15
interfaz gráfico que es
00:01:17
de los dos temas últimos temas que tenemos
00:01:19
abiertos quizás el que
00:01:21
bueno pues el que nos pilla
00:01:23
un poco más a mano para poder contarlo algo
00:01:25
y nada os comentaba
00:01:27
también en tutorías anteriores de cara al examen
00:01:29
que los contenidos de estos dos últimos temas, interfaz gráfica y base de datos
00:01:33
pues no se puede decir que no entren porque ahí están en la asignatura
00:01:38
pero su presencia en el examen es escasa, vamos
00:01:40
que no tiene prácticamente trascendencia en lo que es la nota
00:01:45
ni consecuencias en otros ejercicios que se tengan que apoyar
00:01:48
en algo que tuvierais que hacer y que os bloquee el poder hacerlo
00:01:53
Así que en ese aspecto no os preocupéis. Si lo leéis, si tenéis la oportunidad de leer los temas, pues bien, por esa mínima puntuación que pueda aparecer en el examen, por si la cogéis y si no, pues nada, no os preocupéis tampoco en exceso.
00:01:56
Si no tenéis tiempo y lo tenéis que dedicar al resto de asignaturas o al resto de contenidos de esta asignatura.
00:02:11
y bueno, lo que me digáis un poco, no sé si queréis que comentemos alguna cosa
00:02:18
o como es habitual, me pongo a contaros
00:02:24
si no me decís lo contrario, me seguís escuchando bien, ¿verdad?
00:02:37
pues me pongo manos a la obra
00:02:44
¿me oís verdad?
00:02:46
no me he quedado...
00:02:49
si, vale, bien, bien, por perfecto
00:02:52
pues nada, os cuento, hacemos alguna cosita con interfaz gráfico
00:02:55
para que veáis cómo funciona, y así cerramos un poco la asignatura con esto.
00:02:59
Mirad, en Java, es un lenguaje que tiene mucha más presencia en el entorno web
00:03:08
que en el entorno de escritorio, aquí en esta asignatura no vemos nada de entorno web,
00:03:17
digamos que lo que pretende es sentar las bases de la programación orientada a objetos,
00:03:23
esta asignatura y como hay que apoyarse en algún lenguaje en particular
00:03:27
para ir desarrollándolo, se ha elegido Java, que aparte de que es un lenguaje
00:03:31
con mucha presencia en el entorno productivo
00:03:35
se entiende que es un lenguaje bastante didáctico
00:03:39
es una buena herramienta para entender los conceptos de programación orientada a objetos
00:03:42
Una vez que coges las bases de esta
00:03:47
metodología de programación y empiezas a coger
00:03:51
un poco el rollo a lo que es la algoritmia, trasladarte a otros lenguajes
00:03:55
es bastante sencillo, porque lo difícil de verdad a la hora de programar
00:03:58
es caer en la cuenta de cómo desarrollar los programas,
00:04:03
la mayor parte de los programas siguen esquemas muy parecidos
00:04:06
y es verdad que tiene una sintaxis un poquito distinta a la que hay que acoplarse
00:04:10
cada vez, pero es mucho más sencillo acoplarte a la sintaxis que aprender la algoritmia.
00:04:15
Esto va a servir de entrenamiento
00:04:20
importante para el lenguaje
00:04:22
que vayáis a utilizar luego en un futuro donde
00:04:26
os toque ir.
00:04:28
Las ventanas, bueno, siguen una filosofía
00:04:31
una pizca, ya os digo, vamos a hacer
00:04:35
interfaz gráfico para aplicaciones
00:04:37
de escritorio, es decir, sin descarga vía navegador ni nada
00:04:40
y el interfaz gráfico, bueno, pues
00:04:44
tiene, digamos, la programación un poco guiada por eventos
00:04:46
¿Esto qué significa? Cuando hasta ahora estamos trabajando
00:04:50
con un programa, pues típicamente empieza en el main
00:04:53
y seguimos una secuencia de instrucciones
00:04:56
digamos de arriba a abajo, si llamamos una función
00:04:59
a un método, ejecuta lo de ese método y luego vuelve
00:05:02
pero tiene una secuencia muy directa.
00:05:05
El año que viene trabajaréis con
00:05:09
multi-hilo, aplicaciones multi-hilo que permitirán
00:05:11
la ejecución de la misma aplicación
00:05:14
en diferentes hilos, diferentes líneas de ejecución
00:05:18
de la misma aplicación, pero también
00:05:21
se tendrá una idea como muy lineal
00:05:24
a la hora de ejecutarse. ¿Qué sucede con
00:05:27
la programación esta que se basa
00:05:30
un poco en eventos? Pues que cuando pasan cosas
00:05:33
se ejecutan trocitos de código. Eclipse
00:05:36
mismo, pues en realidad nosotros tenemos aquí
00:05:39
Eclipse y tendrá
00:05:42
en ejecución el código que corresponda.
00:05:44
pues en este momento estará ahí a la espera de que hagamos cosas.
00:05:47
Y es hacer cosas, es que bien con el ratón pinchemos sobre alguna de sus secciones
00:05:51
o bien con el teclado nos pongamos a escribir cosas.
00:05:56
¿Sigue una secuencia totalmente lineal, única y exclusivamente esta aplicación?
00:06:00
Pues no, porque si de repente yo pulso sobre la opción de menú run,
00:06:06
pues me salta este menú emergente por aquí para ofrecernos hacer cosas.
00:06:10
Es decir, se ha ejecutado un trocito de código en respuesta al evento producido con un clic del ratón sobre la opción run. De la misma forma, en cualquiera de las opciones o si estamos creando un proyecto, pues sobre esta ventana ahora habrá un evento que detectará que pulso unas teclas en el teclado, que pulso unas letras aquí, el nombre del proyecto que estoy creando.
00:06:16
Y, claro, cuando estoy haciendo esto, para que me lo escriba aquí y para que ahora al pulsar Finish pase algo, interfaz gráfico no me deja por aquí, no sé por qué ahora mismo no me deja, a ver, lo doy de nuevo.
00:06:40
Bueno, pues evidentemente se produce un evento a la hora de escribir que me generará, que ejecutará una parte de código.
00:07:07
pues bueno, vamos a ver cómo conseguimos hacer esto.
00:07:15
Vamos a crear el proyecto de nuevo, no sé a qué había dado antes.
00:07:19
Interfaz gráfico, Finish, Crear proyecto.
00:07:24
En la programación orientada en Java, todo, todo, todo, todo son clases.
00:07:32
Incluso cuando dibujemos ahora una ventana o pongamos un botón o cualquier componente,
00:07:37
siempre es una clase. Todo, todo son clases.
00:07:43
en el aula virtual nos habla de que
00:07:45
Eclipse o NetBeans nos da la opción de pintar ventanas a través de un
00:07:50
interfaz gráfico. Esto por detrás lo que hace es de forma automática generarnos
00:07:54
clases de código porque al final todo se tiene
00:07:58
que ejecutar a través de clases. Aquí lo que os voy a enseñar yo
00:08:02
va a ser, ignorando un poco esta herramienta que nos ofrecen
00:08:06
los interfaces gráficos, vamos a crear las aplicaciones
00:08:10
con ventanitas directamente a través de código.
00:08:14
Para facilitarnos el trabajo, como sucede con otras cosas,
00:08:19
en las colecciones, acordaros que teníamos clases que eran los conjuntos,
00:08:23
que eran las listas, unas implementadas, unas cosas que estaban repetidas
00:08:28
y no estaban repetidas, y nos apoyábamos en librerías,
00:08:32
clases que teníamos en librerías de Java, pues para este cometido
00:08:36
también tenemos clases disponibles que podemos incorporar a nuestros proyectos,
00:08:39
que nos facilitan tremendamente la posibilidad de crear este tipo de aplicaciones.
00:08:43
¿Qué dos clases son las que se utilizan tradicionalmente?
00:08:48
Pues la AWT, que ciertamente cayó ya en desuso un poco hace tiempo,
00:08:53
aunque mantiene estructuras en las que se apoya la siguiente librería,
00:08:59
y sobre todo la SWIM, para hacer estas aplicaciones de escritorio.
00:09:03
¿Qué aproximaciones hacemos utilizando estas librerías para hacer nuestros ejercicios?
00:09:08
Lo primero que hacemos es hacer el dibujo de la ventana de escritorio sobre la que trabajamos y luego a continuación darle funcionalidad a cada uno de los eventos que se pueden producir al ir trabajando con ello.
00:09:13
Vamos a ponernos manos a la obra y lo vamos contando según lo vamos haciendo.
00:09:29
Vamos a crear una primera clase, como os digo, aquí, que la vamos a llamar, por ejemplo, BenPrint.
00:09:32
como de ventana principal.
00:09:42
Nuestro proyecto Java, pues nos aparece aquí
00:09:47
la clase BenPrim. Para utilizar,
00:09:49
para que los objetos de la clase BenPrim tengan,
00:09:54
vamos a crear, de hecho, también una,
00:09:58
no sé si crear directamente también una clase,
00:10:04
vamos a crear una clase para que nos llame a las ventanas. En lugar de poner el main aquí,
00:10:08
vamos a crear una clase que sea gráfico
00:10:12
o interfaz gráfico, int graph
00:10:16
y en esta, que es para arrancar el programa, vamos a poner el método main
00:10:19
public void, public static
00:10:26
void main, mirad aquí, en esta clase
00:10:30
vamos a meter el main y en esta otra ya va a ser una ventana, para que tenga
00:10:43
el comportamiento, aquí, como cualquier otra clase con la que trabajamos habitualmente
00:10:47
Podremos definir nuestros métodos y nuestros atributos, pero para que tenga características de clase, vamos a decir que herede Stents de Frame, de la clase JFrame, para que sea de Swim, de la librería Swim.
00:10:51
tenemos las librerías, la librería AWT normalmente tiene componentes o elementos que aparecen pintados
00:11:11
que no incluyen esta J, pues frame, si veis un objeto de la clase frame, normalmente va a venir de objetos
00:11:21
de la clase AWT. Cuando se hizo la librería swing, pues prácticamente mantiene los mismos componentes
00:11:30
que tenía w me parece que menos uno cuenta por ahí en la teoría pero para identificar que es de esa
00:11:40
librería lo que hacen es poner en la jota entonces cuando aparece una jota en algo típicamente va a
00:11:46
ser de la librería swing vamos a importarlo le ofrecemos y fijaros como dice importa jota frame
00:11:50
desde java swing efectiva entonces esto ya va a tener la posibilidad de va a tener por herencia
00:11:59
vent print una serie de métodos y propiedades que están definidos en jota frame y que son los que
00:12:07
nos permiten hacer dibujos de ventanitas propias en ahora continuamos por aquí
00:12:12
normalmente digamos que en lo que se respecta a ventanas tenemos dos bloques de tipos de ventanas
00:12:23
en java en estas librerías disponibles las que vienen de jota frame que son ventanas que vamos
00:12:30
a ir dibujando nosotros con botones con radio buttons con diferentes elementos de los que
00:12:36
típicamente nos aparecen por aquí en las aplicaciones de escritorio
00:12:43
y luego están los j
00:12:47
option pane
00:12:49
que, bueno, pues
00:12:52
completando este tipo de objetos de clase
00:12:55
son las típicas ventanas que nos
00:12:58
aparecen porque nos muestran un mensajito de estas ventanas
00:13:01
emergentes o cuando nos ofrecen
00:13:04
dig si no o cancelar
00:13:07
o cancelar o cosas de estas suelen ser este otro tipo, este otro
00:13:09
grupo, digamos, de ventanas. Durante la clase sacamos
00:13:14
alguna de estas también. Ahora lo que estamos diciendo es que
00:13:18
VentPrint es un JFrame, con lo cual va a ser una ventana que vamos a dibujar
00:13:21
nosotros. Mirad, la ventana, o sea,
00:13:25
esta clase ahora va a tener una serie de propiedades y métodos
00:13:32
heredador de JFrame, más los que pongamos nosotros aquí.
00:13:36
pues podemos hacer, por ejemplo, un constructor aquí,
00:13:39
vent, print, constructor de esta clase, y bueno, vamos a llamar
00:13:44
a otro método que sea iniciarVentana.
00:13:53
Podríamos directamente lo que ponemos aquí en iniciarVentana ponerlo aquí en el constructor,
00:13:56
pero bueno, el ejemplo que tengo más o menos que estuve
00:14:01
organizando para enseñaros lo hacía con esta distribución, vamos a mantenerla.
00:14:05
Y aquí vamos a definir el método, public void
00:14:10
init ventana. Entonces si empezamos a
00:14:13
trabajar sobre esto como una ventana, si ponemos el
00:14:23
dis, aquí podríamos poner los métodos directamente, pero no me ayuda el IDE,
00:14:27
pero si ponemos el dis, me ayuda a la hora de ir mostrándolos.
00:14:32
Luego si queréis quitamos el is, para que me salga esta ayuda aquí en el IDE,
00:14:35
estoy poniendo este dis, que es yo mismo, pero si lo quitamos, pues nos
00:14:39
valdría de igual forma. Pues mirad, alguno de los métodos que tiene típicamente
00:14:43
pues el setSize. El setSize nos permite definir con un ancho y un alto
00:14:47
las dimensiones que va a tener esta ventana. Vamos a definir, por ejemplo,
00:14:52
una ventana de un tamaño de 300 y 300. Método que aplica con this
00:14:56
a los objetos que definamos de esta clase, que está disponible gracias
00:15:08
a la herencia del DJFrame. Y está aplicando, bueno, pues como nos sugiere
00:15:13
el nombre del método está aplicando un tamaño y la sed se titel para poner un título el título
00:15:18
por lo que nos aparece aquí igual que en estos de clic se pone aquí en este de él en este poner
00:15:27
debian 12 6 particular de virtual voz o esta de crisis que pone crisis workspace interfaz gráfico
00:15:32
pues aquí ponemos el título que queremos que tenga esa ventana luego cuando la mostremos vamos a
00:15:39
poner aquí por ejemplo ventana 1 o sea numerarlas porque en el ejercicio según vayamos desarrollando
00:15:45
pues os enseño alguna alguna ventana más se locación esto lo que el se locación lo que
00:15:53
nos indica es la posición dentro de toda la ventana donde en el momento de mostrarse por
00:16:02
primera vez va a aparecer la vez va a aparecer nuestra dentro de la pantalla va a aparecer
00:16:07
nuestra ventana. Entonces, a ver, set location y le podemos decir, por ejemplo, que aparezca en la
00:16:13
posición 100, 100. Bueno, cualquiera. Otra de las características que tiene es set resizable, es decir,
00:16:22
si nos permite, cogiéndola del borde, que se haga más grande o más pequeña. Entonces aquí le vamos a poner,
00:16:32
por ejemplo, false. Cada una de todas estas opciones podríamos poner
00:16:38
algunos otros datos. Si ponemos aquí this, fijaros que
00:16:42
tiene un montón de opciones por aquí.
00:16:46
Algunas más vamos a ir viendo, que en cada
00:16:50
caso podríais ir utilizando unas u otras. De momento no vamos
00:16:54
a dar por satisfechos con esto. Fijaros, frame
00:16:58
está este objeto, en realidad lo que nos está marcando
00:17:02
cómo se construyen las ventanas en Java.
00:17:06
Pues tienen un frame, que vendría a ser un borde,
00:17:11
el frame es el borde,
00:17:13
y dentro de ese borde lo que hacemos es
00:17:15
adjuntarle paneles, un panel.
00:17:18
Digamos que sería como si estuviéramos dibujando un cuadro,
00:17:21
el marco del cuadro,
00:17:24
y el panel sería el lienzo
00:17:25
sobre el que nos pondríamos a pintar nuestro cuadro.
00:17:27
Pues el panel es aquel elemento
00:17:31
sobre el que vamos a ir poniendo los diferentes controles, botones, radio buttons, lo que corresponda.
00:17:34
Todo frame normalmente trae por defecto un panel, aunque aquí vamos a crear un objeto de la clase JPanel
00:17:42
para asociárselo a este frame, que va a sustituir el que trae por defecto en realidad,
00:17:50
o sea que ya dispondría de uno, pero vamos a crear un panel para hacerlo.
00:17:55
Entonces utilizamos el objeto de la clase JPanel,
00:18:01
lo llamamos por ejemplo miPanel, igual a new, JPanel.
00:18:06
Este panel es el que vamos a, digamos,
00:18:14
enganchar al marco que va a tener nuestra ventana,
00:18:18
que viene el marco definido por el JFrame.
00:18:22
Importamos el JPanel también para que me compile
00:18:29
y ya tenemos aquí un panel. A la hora de asociar este nuevo panel a la ventana, lo que vamos a hacer es utilizar el método this.setContentPanel
00:18:32
y le decimos que queremos que al marco de esta ventana, de la ventana principal, se le asocie este panel.
00:18:48
Fijaros, podríamos definir aquí diferentes paneles y durante la ejecución del programa ir poniendo diferentes lienzos, como si tuviéramos un marco de un cuadro en el cual ponemos un lienzo que hemos pintado con una bodega y tenemos otro lienzo por ahí que hemos pintado con una escena en el campo,
00:18:58
dando un paseo a un par de personas, pues al marco, al JFrame
00:19:19
le podríamos ir poniendo diferentes paneles, con lo cual
00:19:24
es el mismo objeto de esta ventana con diferentes paneles, si los tuviéramos
00:19:28
iría mostrando diferentes contenidos en cada momento
00:19:32
en particular ahora de momento vamos a trabajar con un panel solo, este
00:19:35
que acabamos de definir aquí, dejo por aquí hueco porque nos va a interesar
00:19:40
ir haciendo cosas por aquí entre medias, después de asociar
00:19:44
el panel este, una de las cosas que podríamos hacer es
00:19:50
indicar que queremos que esté visible
00:19:54
podemos tener una ventana creada, fijaros, un objeto
00:19:58
creado, cuando hagamos un new de un objeto de esta ventana
00:20:02
en memoria RAM tendremos la ventana, pero podrá estar
00:20:05
a la vista en la pantalla o podrá estar oculta. Entonces eso lo podemos
00:20:10
manejar con el método set visible del
00:20:16
JFrame, se ve visible, vamos a ponerle aquí true, queremos que se vea
00:20:19
y de momento vamos a hacer una primera ejecución con esto
00:20:23
esta ventana, cuando hagamos el new, llamará al constructor
00:20:29
hará una inicialización de la ventana, dará un tamaño
00:20:35
un título, dirá posiciona en la pantalla en un determinado sitio
00:20:39
no permitas que se pueda modificar su tamaño
00:20:43
al marco de esta ventana, aplícale
00:20:48
este lienzo este panel que hemos definido por aquí y a lo que esté visible desde aquí que
00:20:51
tenemos el main lo que vamos a hacer es como hemos hecho siempre durante el curso vamos a
00:20:58
crear un objeto que vamos a llamar mi ventana 1 por ejemplo de la clase ven print que tendrá
00:21:06
las características de todo lo definido aquí más todo el heredador de jota frame cuando hagamos
00:21:13
ahora el new, se hará su reserva en memoria y llamaremos a la ejecución del constructor y el
00:21:19
constructor llama este método init ventana y este init ventana hace esto, da estos valores y
00:21:30
finalmente la pone visible. Entonces si cogemos y damos aquí una ejecución al programa, pues fijaros
00:21:36
cómo me ha salido la ventanita, la veis aquí, en esta ventanita tenemos que tiene un tamaño de 300
00:21:45
por 300, bueno, pues nos creemos que es 300 por 300, es cuadradita, eso sí que es
00:21:53
cierto. Inicialmente me ha salido como por aquí, que es el 100-100 este
00:21:58
con un título ventana 1 y fijaros
00:22:02
que aunque me venga aquí con el ratón, no me da la opción de redimensionarla
00:22:06
y por aquí, por aquí tampoco, también lo tiene
00:22:10
deshabilitado, veis, en el que se haga mayor o menor y con el
00:22:13
ser visible true, pues se ha mostrado. Al marco
00:22:18
del frame aplicado un panel el lienzo que ha sido mi panel que en principio lógicamente se genera
00:22:22
sin ningún contenido con lo cual tenemos una ventanita que por aquí está en blanco para la
00:22:29
aplicación para seguir metiendo cosas si tenéis dudas me va a ir diciendo como siempre vamos a
00:22:37
vamos a añadir alguna cosita aquí a la ventana entonces lo que haremos será fijaros vamos a
00:22:43
construir como os digo en java todo todo todo son clases y dentro de los componentes que habréis
00:22:52
podido ver en el tema pues hay botones hay bueno pues hay un montón de ello vamos a trabajar hoy
00:22:58
con tres o cuatro para ver la filosofía y luego cada uno tendrá alguna característica un poquito
00:23:04
particular que con más clases lo desarrollaremos más y si os veis en la necesidad como no vamos a
00:23:09
tener más clases pues os tocará investigarlas pero un poco vamos a sentar cómo funcionan en
00:23:15
general todos los componentes y las pautas que hay que ir dando para ponerlo en marcha. Uno de los
00:23:20
componentes más típicos son los botones. Entonces vamos a poner JButton. Vamos a crear un botón.
00:23:26
Botón, por ejemplo, vamos a llamarlo botón saludar. Vamos a poner aquí. Vamos a crear como
00:23:34
atributo de clase un botón. Fijaros que como es J será de la librería Swim y vamos a importarlo.
00:23:44
Aquí vamos a poner un comentario botones. Insisto, fijaros cómo estamos definiendo una referencia, no hemos hecho el new, lo podríamos hacer aquí o lo podemos hacer abajo en el código para un objeto de la clase JButton que pertenece, como veis aquí, JButton a la librería Swing.
00:23:55
pues vamos a ver que tenemos que hacer para que este botón termina apareciendo en el JFrame
00:24:16
vamos a poner aquí botones, entonces lo primero que vamos a hacer va a ser
00:24:25
hacer el new, vamos a hacer un new para esta referencia, esto lo podríamos haber hecho también aquí
00:24:29
lo podemos poner aquí y los botones permiten varios constructores
00:24:40
uno que está vacío y luego permite también poner constructores
00:24:46
un constructor sobrecargado con un string, donde pongamos aquí
00:24:51
un texto del string y es el contenido que va a aparecer luego en el botón.
00:24:55
Entonces damos de aquí de alta el botón.
00:25:00
Bien, otra cosa, contaros otra cosa, cuando
00:25:10
vamos a dibujar una ventana,
00:25:13
una nueva ventana, como la que estamos haciendo ahora,
00:25:18
existe la posibilidad de que tenga diferentes layout.
00:25:21
esto qué significa que según vayamos añadiendo componentes botones por ejemplo diferentes
00:25:24
elementos en la ventana por defecto se vayan colocando de una determinada manera entonces
00:25:31
hay unos cuantos layout yo de verdad que no conozco muchos hay uno que permite situar las
00:25:36
cosas según posiciones en la ventana entonces te define un espacio norte un espacio es este
00:25:42
un espacio este un espacio sur y un espacio central y los componentes que pones en cada
00:25:49
unos espacios se van poniendo en esa zona. Si tú dices, quiero que me crees un botón
00:25:54
y ponlo en la zona sur, pues coge y ese botón cuando lo añades
00:25:58
te lo pone por aquí abajito. Dices, pónmelo en la zona norte y te lo pone aquí.
00:26:01
Pónmelo en la zona centro y te lo pone aquí. Hay otros layouts
00:26:06
que lo que hacen es ir poniéndote de forma secuencial de izquierda
00:26:09
a derecha como si estuviéramos escribiendo en un cuaderno y dices, el primer botón
00:26:14
te lo pone justo a la izquierda aquí y el siguiente te lo pone a continuación
00:26:18
como si estuviéramos, ya os digo, escribiendo aquí.
00:26:21
Si pones otro botón. Y si ahora pones un combo
00:26:24
vos, te lo pondría aquí. Y si ahora
00:26:25
pones otra cosa, aquí.
00:26:27
Y cuando se completa esto, te salte y te empieza a poner
00:26:29
como en otra línea, componentes
00:26:31
por aquí.
00:26:33
Según el diseño de cada una de las ventanas, te puede
00:26:35
interesar uno u otro porque te resulte más
00:26:37
cómodo.
00:26:39
Yo casi tengo la costumbre de decir,
00:26:41
mira, quiero total libertad para
00:26:43
colocar los componentes. Luego, si nos da tiempo,
00:26:45
utilizamos un ejemplo, por ejemplo,
00:26:47
del layout este que ofrece
00:26:49
la posibilidad de norte, sureste, oeste y centro, pero este primer ejemplo, estos primeros ejemplos,
00:26:51
por lo menos lo voy a hacer con total libertad. Entonces, para eso, lo que hacemos en la ventana
00:26:56
es decirle, no recuerdo si es en la ventana o es en el panel, quizás sea en el panel, creo que es
00:27:02
en el panel, entonces vamos a decir que el panel tenga un set layout, aquí definimos el tipo de
00:27:12
layout y según lo que pongamos aquí, creo que en la teoría os habla de diferentes layouts, se comportaría
00:27:18
de una forma norte, sureste, oeste, uno secuencial uno detrás de otro, pero si le ponemos la opción
00:27:25
null, es decir, ninguno, lo que estamos diciendo es no consideres por defecto ningún layout que voy a ir
00:27:31
colocando yo las cosas a mano. Vamos a hacer este ejercicio así, totalmente con el control total de
00:27:36
dónde ir situando los diferentes controles, en este caso por ejemplo un botón dentro del panel
00:27:42
que a su vez el panel está metido en el marco
00:27:48
con lo cual será como van a aparecer distribuidos los
00:27:51
componentes en nuestra ventana. Y para hacerlo con toda libertad
00:27:54
lo hacemos de esta forma. Si lo hacemos de esta forma, ahora este botón
00:28:00
podría ir en cualquier sitio. ¿Y ese cualquier sitio cómo lo
00:28:04
definimos? Pues lo que decimos es que el objeto de botón
00:28:08
saludar y le decimos set bones
00:28:12
Y este nos permite poner un objeto de la clase rectángulo, fijaros, o está sobrecargado y nos permite decir en qué posición X e Y está el punto, en este caso el botón, de arriba a la izquierda, qué ancho tiene y qué alto tiene, con cuatro parámetros.
00:28:15
parámetros. Entonces, por ejemplo, para este botón vamos a decirle que esté
00:28:35
en X en la posición 10, en Y
00:28:41
en la posición 20, que tenga un ancho de 100,
00:28:45
esto ya dependería del diseño que tengáis en vuestra
00:28:50
ventana, y de 20. Decimos, este botón, cuando se coloque,
00:28:53
que se coloque en estas posiciones. Si el layout del panel
00:28:57
es uno de los otros, seguramente ignore el
00:29:01
setBounce este. Pero si es nulo, es decir, no está obligando
00:29:05
mi panel a una distribución de los componentes en particular, sino que le he dicho
00:29:09
nulo porque quiero tener yo el control, este botón, ¿en qué posición se va a colocar en el
00:29:13
layout? En el panel, en estas. Considerando
00:29:17
este como punto de arriba a la izquierda, en el
00:29:22
botón, el ancho y el alto. Y luego lo que hacemos es
00:29:25
hemos definido un panel, este panel se lo
00:29:33
añadido al frame hemos definido un botón y antes os decía podríamos tener diferentes paneles y
00:29:40
luego ir aplicando diferentes paneles al mismo frame al mismo a la misma ventana entonces este
00:29:47
botón si tuviéramos diferentes paneles en cuál de todos los paneles aparecería si tuviéramos
00:29:53
distintos aquí parece que estamos tenemos tendencia que vaya a estar en este no porque
00:29:58
es el nuevo que hemos definido pero en cuál de todos ellos si tuviéramos varios que posteriormente
00:30:03
iríamos poniendo unos otros en el jota frame pues para indicar en qué panel va lo que hacemos es
00:30:08
indicarlo de esta forma decimos mi panel que es el panel este punto adb añádeme fijaros que aquí
00:30:14
me dice añádeme un componente un componente que va a ser en este caso quien el botón saludar entonces
00:30:23
este botón que hemos definido aquí una referencia del cual hemos hecho aquí un new que tenga el
00:30:31
texto saludar digo cómo se va a posicionar en un layout el cual hemos indicado en un panel que
00:30:37
hemos indicado que su layout sea nul y ahora decimos que lo añada. Fijaros cómo ahora si cojo y ejecuto
00:30:44
la aplicación, me aparece ya el botoncito este, ahí tenemos el botón, botón con texto saludar en la
00:30:50
posición 10x20i con un ancho de 100 y un alto de 20 y hemos añadido este botón a este panel y este
00:31:02
panel a este frame con lo cual dentro del frame que contiene el panel que será esto que está aquí
00:31:12
en gris aparece el botón saludar todo lo que estamos haciendo hasta ahora es estético si
00:31:16
nosotros pulsamos el botón que sucede no sucede nada veis bueno sucede que da la sensación de
00:31:25
estarse pulsando pero en realidad no tiene ninguna consecuencia sobre sobre nada pues una vez que
00:31:31
hemos trabajado sobre la parte diseño gráfico de un componente de los diferentes componentes que
00:31:38
iremos poniendo por aquí en particular hemos empezado con un botón ahora vamos a hacer que
00:31:46
esto tenga sentido y como os decía la jugada se divide entre dibujo y comportamiento cómo hacer
00:31:50
las cosas. Para definir
00:31:57
y nuevamente continuamos con
00:32:00
el trabajo siempre en clases, porque en Java
00:32:03
todos son clases. Entonces, lo que decimos aquí
00:32:06
ahora para el botón este, decimos el botón saludar, decimos
00:32:09
add, action listener
00:32:12
hay muchas alternativas para hacer cosas
00:32:15
pero esta es la típica en un botón
00:32:20
aquí lo que estamos diciendo es, mira
00:32:22
para este objeto, que es un botón
00:32:26
vamos a activar un escuchador
00:32:29
para cuando suceda un evento, es decir
00:32:32
lo que decía antes de Eclipse, cuando suceda y con el ratón
00:32:35
yo le doy aquí a run, pues sucede un evento
00:32:38
pues ponte que la aplicación esté dándose cuenta
00:32:41
si con el ratón pulso este run, como opción de menú
00:32:44
en particular estamos añadiendo, poniéndolo a la escucha
00:32:47
para que cuando se produzca
00:32:50
tenga un escuchador, una orejita ahí puesta
00:32:54
para cuando se produzca una acción. ¿Sobre quién? Sobre este elemento.
00:32:56
Y aquí nos dice, aparece un nulo ahora por defecto.
00:33:00
Aquí lo que vamos a indicar va a ser la clase donde vamos a poner el código
00:33:05
que se tiene que ejecutar cuando se produzca una acción sobre este botón.
00:33:10
Entonces aquí podríamos, a ver qué tiempo nos va permitiendo hacer cosas.
00:33:18
Luego podemos crear una clase diferente. Otra opción que tenemos es decir que el código para atender este botón sea esta misma clase. Si ponemos aquí this, esto lo que quiere decir es que esta misma clase, BenPrint, tendrá el código para atender aquellas acciones que hay que ejecutar cuando se produzca una acción sobre el botón pulsar.
00:33:26
Bueno, aquí se me queja, ¿verdad? Dice que he metido esto. ¿Qué es lo que sucede? Que esta clase no está preparada para hacer esto.
00:33:48
Entonces, lo que tenemos que hacer aquí es implementar, ponemos un implement, un interfaz, que es el interfaz ActionListener. Fijaros, he dicho, añade ActionListener al botón saludar y esperamos que la clase que lo atienda sea esta misma.
00:34:04
y ahora lo que decimos es que esta clase
00:34:32
que precisa implementar los métodos de ActionListener
00:34:35
porque hemos dicho aquí this, le ponemos aquí implements
00:34:40
ponerlo por aquí, me dice
00:34:43
que importe el JavaEventActionListener
00:34:45
y ahora como hemos implementado, hemos puesto aquí un interfaz
00:34:51
me deja de compilar porque no tengo los métodos necesarios
00:34:55
a los que me obliga esta interfaz
00:34:58
escojo y digo ahora añádeme los métodos no implementados
00:35:00
y fijaros que me ha añadido este método, el ActionPerformance
00:35:06
ActionPerformance es el método al que me obliga el ActionList
00:35:10
tener este. ¿Qué sucede? Con esto que habíamos
00:35:14
puesto antes, habíamos conseguido, voy a bajar esto abajo
00:35:20
pintar el botón y ahora estamos
00:35:24
buscando la técnica que Java nos permite para que cuando
00:35:27
pase algo sobre el botón, porque hemos dicho, oye, pon una orejita
00:35:31
con el listener para cuando pase algo en este botón y que el código
00:35:35
que lo considere esté en esta clase,
00:35:40
como es ActionListener que estamos añadiendo, metemos el interfaz
00:35:44
e incluir esta interfaz me obliga a tener
00:35:48
este método. Entonces fijaros, si ponemos aquí un
00:35:51
system.out.println pulsando
00:35:55
un botón y ahora ejecutamos
00:36:03
System.out, escritura por consola, nos escribirá aquí
00:36:07
y ahora ejecutamos. Mirad como al pulsar el botón
00:36:11
nada más arrancar, hemos puesto
00:36:17
una acción listener, pues estará algo dentro del programa, la escucha
00:36:21
a ver si pasa algo en este botón. Cuando hagamos un clic
00:36:25
con el ratón en el botón, es de esperar que se ejecute
00:36:29
ese método, entonces damos aquí, veis como me saca aquí pulsando botón
00:36:34
el dibujo gráfico del botón ya lo hemos
00:36:37
asociado con una zona de código donde podremos poner
00:36:40
lo que tenga que pasar cuando pulsemos este botón
00:36:42
en un programa será escribir en un fichero, en otro será
00:36:45
lo que vaya tocando, vamos a poner un segundo botón
00:36:49
lo hago así un poquito rápido porque esto ya es
00:37:01
un poco complicado, hacemos botón saludar 2
00:37:06
entonces aquí en la zona de botones
00:37:09
voy a copiar todo esto
00:37:11
digo botón saludar, le cambio aquí el texto, 2
00:37:14
este otro botón pues lo vamos a colocar un poco desplazado
00:37:21
entonces por ejemplo cambiamos la X, decimos que se posicione
00:37:25
en X150 con la misma Y
00:37:29
estará a la misma altura, mismo ancho y mismo alto
00:37:33
decimos sal 2, aquí decimos que estamos trabajando sobre el botón 2
00:37:35
este botón ahora mismo no está asociado a ningún panel
00:37:41
no aparecería en ningún sitio, pero le decimos mi panel add2
00:37:44
y también queremos que tenga
00:37:48
que se ponga a la escucha de cuando pase algo en este botón, con lo cual
00:37:50
le decimos botón2, addActionListener y la clase donde
00:37:56
se va a gestionar, donde va a estar el código, donde se va
00:38:00
a gestionar el clic sobre este botón
00:38:04
si le damos aquí y volvemos a ejecutar
00:38:08
fijaros ahora nos aparecen ya dos botones
00:38:12
si damos saludar
00:38:16
nos dice pulsando botón, si damos
00:38:17
sal 2, también nos sale
00:38:19
¿qué le hemos dicho al programa?
00:38:21
le hemos dicho que en ambos casos
00:38:28
pongo un ActionListener y este ActionListener
00:38:29
se ha asociado con el ActionPerformat
00:38:32
y en este hemos dicho que
00:38:34
muestre por pantalla pulsando
00:38:36
botón, con lo cual los dos nos muestran
00:38:38
pulsando botón
00:38:40
en consola
00:38:42
Pero claro, en una aplicación normal nos interesaría que pulsar un botón hiciera unas cosas y pulsar otro botón hiciese otras. Ambos dos están ejecutando este método, con lo cual no sé distinguir si este pulsando botón que me ha escrito es porque he dado clic al botón saludar o al botón saldos.
00:38:46
¿Cómo podemos gestionar esto? Pues mirad, aquí podríamos coger, fijaros cómo este método aquí coge, recibe un objeto y este objeto nos da información, contiene información del momento en el que se lanza el evento, en el momento en el que en este caso pulsamos los botones.
00:39:07
entonces aquí lo que podríamos hacer es
00:39:29
si ponemos if
00:39:33
fijaros que estamos programando en java
00:39:34
como hemos hecho durante todo el curso
00:39:38
en sus métodos considerando conceptos como interfaces
00:39:41
que hemos añadido métodos
00:39:45
la clase la hemos definido como una clase
00:39:47
la hemos seleccionado de jframe para que tenga
00:39:49
todas las funciones de comportamiento como una ventana
00:39:53
de escritorio
00:39:57
entonces ponemos aquí if e get source, aquí me indica la fuente de quien ha ejecutado este evento, si decimos que este es igual, si ha sido el botón, botón saludar, de esta forma me permite diferenciar entre un botón y otro, aquí ponemos un else if por ejemplo, si en lugar de botón saludar ha sido el botón saludar 2,
00:39:59
Y ahora aquí ya podríamos poner código que nos diese respuesta a pulsar uno de los botones, escribir un fichero en no sé qué, abrir otra ventana, lo que correspondiese, simplemente para ver su funcionamiento.
00:40:26
Vamos a poner un system out, botón saldos aquí y aquí botón saludar. Fijaros ahora si pulso el botón saludar, efectivamente dice pulsando saludar, se ha dado cuenta con el guest source que es este botón, aunque los dos hacen que se ejecute el mismo método, con ese if ya se ejecuta el código asociado al pulsado de este botón.
00:40:42
Si pulsamos Sal 2, el mensaje que nos muestra aquí abajo ya es pulsando Sal 2. Aunque en ambos casos utilizamos el mismo Listener, que es el ActionListener, podemos diferenciar si el método se ha ejecutado desde una fuente o desde otra.
00:41:14
diferente con el getSource. Aquí tenemos con nuestro diseño, nuestro programa,
00:41:32
necesitaríamos uno, dos, tres, veinte botones, pues podríamos colocar
00:41:41
tanto como fueran necesarios de esta forma, cada uno de ellos con un objeto
00:41:47
de una clase JButton. En este caso todos ellos lo podríamos asociar a este
00:41:51
listener, hay más listeners, ahora veremos alguno más. Este listener al implementar
00:41:56
interfaz nos obliga a añadir este método solamente uno en la acción performance
00:42:02
que es el que se ejecuta cuando pasan cosas sobre una acción listener y con el
00:42:07
guest source podemos diferenciar entre unos y otros otro componente típico que
00:42:12
aparece en prácticamente todas las ventanas son este menú principal pues
00:42:22
este menú principal se también lo vamos a crear a partir de objetos de
00:42:28
objetos de clases que tenemos en la librería suene vamos a poner aquí menú y vamos a ponernos a la
00:42:35
marcha con él mira pues vamos a definir los menús se estructuran en jota menú bar un objeto de este
00:42:44
de este tipo que vendría a ser el elemento que nos permite tener un menú aquí arriba y ahora
00:42:53
vamos a añadiendo elementos a este menor por ejemplo llamamos barra menos vamos a importarlo
00:43:00
de Swing, como empieza por J
00:43:08
ya teníamos la sospecha de que iba a ser de la librería
00:43:12
Swing, al menú
00:43:14
digamos que eso es la barra
00:43:19
cada uno de los elementos
00:43:23
principales que tiene aquí, File, Edit
00:43:24
Source, cada uno de estos serían
00:43:27
objetos de la clase JMenu
00:43:28
entonces por ejemplo
00:43:31
podemos definir una
00:43:33
un
00:43:34
elemento que sea
00:43:37
MenúArchivo
00:43:39
o el que aquí pone File, pues MenúArchivo
00:43:40
Hemos definido el JBar, que sería el conjunto, digamos, una estructura que nos permite definir un menú y ahora un JMenu, que sería uno de estos. File, pues lo vamos a llamar menú archivo de ese objeto. Lo importamos también.
00:43:46
Y ahora al pulsar sobre File nos aparecen diferentes opciones, aquí veis, en Edit también, pues cada una de estas opciones en Java las podemos definir como JMenuItem y por ejemplo vamos a definir el ítem Salir, todos ellos de la librería Swing que tenemos en Java.
00:44:00
vamos a poner aquí, que es lo primero que tenemos que hacer si son referencias a objetos de clase
00:44:35
podríamos haberlo hecho aquí, pero lo podemos hacer directamente aquí también
00:44:40
pues vamos a hacer el new, entonces tenemos aquí, le decimos igual a new
00:44:45
y vamos a su constructor, el jmenu, le hacemos el new
00:44:50
y por aquí el jmenu tiene la opción de constructor vacío o constructor en el cual
00:45:03
igual que en los botones podemos incluir ya el texto este
00:45:14
está sobrecargado con un string, entonces podemos poner aquí
00:45:17
archivo, y en el jMenuItem vamos a hacer la misma jugada
00:45:21
y el jMenuItem también está sobrecargado y podemos
00:45:26
recordar, los jMenuItem son los que aparecen por aquí, en una opción de menú
00:45:35
colgando, y también tienen, están sobrecargados, está sobrecargado
00:45:39
el método constructor y nos permite con un string meter el nombre
00:45:43
entonces este como lo hemos llamado itemSalir, vamos a ponerle aquí salir
00:45:47
Vale, pues para seguir construyéndolo esto, lo que decimos es que esta ventana, este frame, lo tenemos definido por ventana principal, decimos this, asocia a este frame setJMenu, una barra de menú y le identificamos qué barra de menú queremos añadirle.
00:45:51
Con lo cual esta barra de menú está asociado ya a esta ventana, pero estos objetos no están asociados por el momento a esta barra de menú, pues vamos a hacerlo.
00:46:32
lo que decimos es que el menú archivo.add, añádelo y se lo añadimos a la barra de menú.
00:46:44
Estamos diciendo que este elemento, este jMenu, se lo estamos añadiendo a esta barra
00:47:01
y esta barra se lo estamos añadiendo como menú a la ventana.
00:47:08
Entonces, archivo lo hemos añadido a la barra de menú que se lo hemos puesto a la ventana, pero el menú archivo tiene un ítem, que es los que van a colgar por aquí, que también tenemos que asociarlo.
00:47:12
Fijaros cómo vamos pasito a pasito metiéndolo. Entonces ponemos aquí menú, creo que lo he puesto mal el de arriba, ahora ADD, al menú archivo, lo he puesto mal el de arriba, ahora lo cambio, al menú archivo lo que hacemos es añadirle el ítem.
00:47:33
Y en verdad, digamos, tenemos la barra, el JMenu y el JMenuItem. A la barra tenemos que añadir el JMenu, entonces este es que a la barra menú le añado el JMenu.
00:47:58
la barra en sí se la añado
00:48:21
al frame, a la barra le añado
00:48:25
el jMenu y a la jMenu le meto el jMenuItem
00:48:29
si hacemos ahora una ejecución, vamos a ver si nos sale
00:48:33
fijaros, ha añadido la barra
00:48:40
el jMenuBar, que es todo esto, fijaros como aparece un poquito más en gris
00:48:43
y un poquito sobrepuesto, a la barra le hemos metido
00:48:48
un JMenu que es archivo y al JMenu le he movido un JMenuItem
00:48:52
que es el salir. ¿Qué sucede si ahora pulso
00:48:56
y aquí salir? No parece que esté sucediendo nada. ¿Por qué?
00:49:00
Pues porque nos está pasando exactamente lo mismo que cuando hemos puesto los botones.
00:49:04
Lo que hemos hecho hasta ahora ha sido dibujar el
00:49:08
componente dentro del frame, pero dentro del panel
00:49:12
y como consecuencia en el frame, pero sin poner ningún listeners
00:49:15
y sin decir que suceda nada en particular cuando estemos trabajando
00:49:19
con ello. Pues para eso tenemos que hacer como con los
00:49:23
botones y en particular la opción
00:49:27
ítem, es decir, la de salir es a la que le queremos añadir algo.
00:49:37
Entonces ponemos, igual que hemos hecho antes aquí,
00:49:42
las opciones de menú también utilizan el ActionListener, hay
00:49:46
más Listener, ahora por lo menos otro más veremos ahora.
00:49:49
Entonces le decimos que al JMenuItem le añade un AddActionListener y aquí, como antes, tenemos que decirle qué clase es la que va a atender ese ActionListener. Decimos que sea esta misma.
00:49:52
Entonces, ahora nos venimos aquí. Fijaros que es el mismo, es el ActionListener, es el mismo que en estos casos que hemos incorporado a través del interfaz. Cuando le hemos dicho métodos necesarios para ese interfaz, nos ha metido el ActionPerformat, con lo cual este nuevo elemento que estamos metiendo también va a lanzar la ejecución de este ActionPerformat.
00:50:07
como es una casuística diferente a pulsar el botón saludar o saludar 2
00:50:35
pues aquí lo que vamos a hacer va a ser diferenciarlo
00:50:39
también, decíamos cuando pulsemos el botón saludar, botón saludar 2
00:50:43
pues aquí cuando pulsemos
00:50:47
el ítem salir, pulsando salir, ejecutamos
00:50:49
y ahora si voy a salir, fijaros como ya me sale aquí
00:51:05
pulsando salir, hemos capturado el evento de pulsar con el ratón salir
00:51:09
se va al método
00:51:13
que está definido para atender ese evento
00:51:17
y hace lo que hemos puesto por código. En este caso es pulsando, hemos dicho
00:51:21
que haga un system of println de pulsando salir. Vamos a
00:51:25
hacer algo que sea un poco más real, que no sea pulsar salir de lo que
00:51:35
suele pasar cuando hacemos estas cosas. Podríamos poner
00:51:39
si queréis un primer mensaje, antes decía, tenemos en las librerías
00:51:43
de Java, los JFrame y otras ventanas que suelen ser informativas
00:51:47
o para capturar información, vamos a poner aquí una informativa, podemos poner
00:51:51
JOptionPane
00:51:55
una clase que está disponible en la librería de Java
00:51:58
y fijaros, tiene un montón de cosas por aquí
00:52:03
muchas alternativas, una de ellas es muestra un mensaje
00:52:06
por ejemplo, MessageDialog, muestra un dialog, vendría a ser una ventana con
00:52:13
un mensaje, me pide aquí dos parámetros, este primer parámetro sería el contenido
00:52:16
de este mensaje, quieres que se asocie a alguna ventana en particular que ya exista
00:52:26
en el proyecto, si pones null te crea una nueva y aquí podemos poner el mensaje, entonces
00:52:30
por ejemplo como mensaje podríamos poner pulsado el botón salir del menú, en lugar
00:52:36
de un System.out, vamos a hacer que nos muestre un mensajito al pulsar
00:52:48
salir. Entonces, si ejecutamos ahora, vamos aquí
00:52:52
y fijaros cómo me sale aquí una ventanita.
00:52:56
Bueno, tampoco es lo habitual que nos salga una ventana informativa
00:53:00
pulsando el botón salir del menú, sino que se salga de la aplicación o de la ventana
00:53:04
como poco. Pero bueno, así vemos por si necesitamos
00:53:08
sacar un mensajito en algún momento, pues con un Joption Paints o un
00:53:12
messageDialog, somos capaces de mostrar una ventanita. Si lo que queremos
00:53:16
es acabar la aplicación, pues tenemos al menos
00:53:22
dos alternativas. Una que es llamar al mento dispose.
00:53:26
Este método te acaba la aplicación. Yo si ahora voy a salir,
00:53:32
fijaros, como se me acaba, ha desaparecido y se me ha ido aquí el botoncito rojo.
00:53:42
Bueno, y otra alternativa también es
00:53:49
a través de un system.exit.
00:53:52
System.exit y aquí podríamos meter un valor numérico, que bueno, si esta aplicación fuese lanzada por otra, podría llegar a capturar este valor y gestionar esa aplicación que ha arrancado esta, pero bueno, es algo que veréis en otro momento.
00:53:58
Consiste en exit, podemos acabar la aplicación también, entonces le damos aquí un archivo salir, fijaros como también acaba la ventanita, se apaga aquí el rojo y se cierra la ventana.
00:54:14
Bueno, pues opción de menú, si aquí tenemos archivo, edit, source, refactor, en esta, si quisiéramos tener más elementos aquí, sobre esta barra, tendríamos que definir un mayor número de elementos de JMenus, para que no solamente fuera archivo, y cada uno de estos los tendríamos que añadir al barra menú, como hemos hecho aquí.
00:54:30
mirad como al barra menú le hemos añadido el jMenu
00:54:52
el único que tenemos en la aplicación, pues tendríamos que tener más veces el barra menú
00:54:58
add y te iría poniendo uno detrás de otro, y cada uno de estos
00:55:03
jMenu tendrían una serie de jMenuItems, en este caso
00:55:06
hemos puesto uno solo, de momento, ahora si acaso a lo mejor ponemos alguno más
00:55:11
pues en cada jMenu podría tener sus jMenuItems, como aquí
00:55:14
veis otro elemento que podemos poner pues los radio button ahí están hay mil opciones muy
00:55:19
bueno muchas no tenemos campos de texto tenemos áreas de texto tenemos radio button con bobos
00:55:35
vamos a meter un radio button cada uno tiene alguna característica un poco diferente lógicamente no
00:55:42
dar tiempo a ver todos pues los que nos dé tiempo los vemos y la idea todo el rato va siendo la
00:55:50
misma con pequeños matices de unos u otros pero la idea es la misma lo dibujamos y una vez que
00:55:56
lo hemos dibujado pues tenemos que decirle por dónde podemos actuar sobre ellos
00:56:07
imaginaos antes de meter los radio button vamos a hacer una cosa diferente para meter un listener
00:56:20
diferente imaginaos que es una ventana que cuando le demos salir queremos tener la opción de decir
00:56:27
oye mira es verdad le hemos dado salir pero quiero comprobar si efectivamente o quiero sacar una
00:56:35
ventana de confirmación preguntando si de verdad quiero salirme o no quiero salirme por ejemplo
00:56:42
si no venimos aquí le pulsamos a la equis se sale fijaros que no se ha terminado ni siquiera el
00:56:52
programa, veis que sigue aquí, es decir, ha escondido esa ventana pero el programa no ha terminado, no ha
00:56:58
ejecutado el pulsar la X un Dispose o un System Exit como hemos puesto aquí, si vamos por la opción
00:57:05
de menú, sí que hemos puesto el Dispose o el System Exit, pero en ese caso no, ha cerrado la ventana
00:57:13
pero la aplicación, veis aquí en rojito que está arrancada, pues si doy aquí a la cruz, se va la
00:57:18
ventana, es cierto, pero no acaba el programa. El programa se iría
00:57:25
por ahí en ejecución. Esa ventana ha desaparecido, no ha considerado que termine
00:57:29
el programa, para lo cual es necesaria alguna de estas instrucciones.
00:57:34
¿Somos capaces de alguna forma de tener un espacio de código
00:57:40
donde poner nosotros lo que queramos que pase cuando
00:57:44
pulsemos la X o a través de aquí, creo que también nos da la opción
00:57:48
cerrar. Pues sí que lo tenemos. Vamos a ver cómo lo podemos hacer.
00:57:52
la opción esta, en lugar de ser de un botón
00:57:56
o de una opción de menú, es una acción que tiene que ver
00:58:07
con la ventana en sí. Entonces lo que podemos poner
00:58:10
igual que aquí, al botón
00:58:14
para que tuviera comportamiento, le hemos metido una acción listener
00:58:19
al elemento, el ítem del menú o al botón
00:58:23
podemos poner this, this es el propio objeto
00:58:28
de la clase BenPrint
00:58:34
addWindows
00:58:35
fijaros aquí tenemos diferentes opciones que nos presenta
00:58:42
aquí, addWindowsFocusListener cuando saltará
00:58:48
una zona de código si añadimos
00:58:52
este listener cuando la ventana coja el foco
00:58:55
WillListener, no sé exactamente, pues el WillListener tiene pinta de ser
00:58:58
en el ratón si pulsas ahí la ruedecilla, ¿no?
00:59:05
Probablemente salte una zona de código para si pulsas sobre la ventana la ruedecilla
00:59:08
tengas control de poder hacer ciertas cosas.
00:59:12
Una un poco más general de toda la ventana es el AddWindowListener
00:59:16
que es diferente al AddActionListener sobre el botón. Entonces vamos a
00:59:21
añadir este Listener aquí a la ventana.
00:59:24
y que nos ofrece aquí la posibilidad de identificar en qué clase
00:59:28
se gestiona ese código.
00:59:32
Perdón, me ha atascado.
00:59:37
Entonces, si le decimos this, lo que estamos diciendo es
00:59:39
la clase donde queremos que se gestionen
00:59:41
los eventos que se produjan sobre la ventana
00:59:44
porque estamos añadiendo al window
00:59:47
este listener, aquí podemos decir qué objeto queremos que sea
00:59:50
y, por ejemplo, podemos decir que sea este objeto.
00:59:54
Ahora después también cambiamos para demostrar cómo poner algo diferente de este dis.
00:59:57
Como estamos diciendo que esta clase tiene que atender esto, se ha empezado a quejar.
01:00:03
¿Por qué? Porque para esta clase no tenemos el código necesario para atenderlo.
01:00:07
¿Qué vamos a hacer? Pues lo mismo que antes.
01:00:12
Vamos a hacer que implemente el interfaz WindowsListener, esta clase.
01:00:14
Venimos aquí y junto a este le ponemos aquí una coma.
01:00:21
decimos, oye, también tienes que atender
01:00:24
hacer el listener de una ventana, que por aquí lo han añadido
01:00:27
y han dicho que es esta clase la que lo atiende. Entonces, cojo
01:00:33
por aquí y digo que me incorpore, que me importe esto
01:00:40
y ahora, por aquí, le digo, añádeme los métodos
01:00:44
que no están implementados a los que me estoy obligando al firmar
01:00:48
un contrato, contrato entrecomillado, con la interfaz acción listener
01:00:51
para esta clase, entonces cojo y digo
01:00:56
méteme los métodos no implementados, y fijaros como aquí
01:01:00
me ha puesto una serie de métodos, si el ActionListener me metía
01:01:04
un método solo, esa interfaz me obligaba a considerar
01:01:08
este método, pues el WindowsListener me obliga a tener implementados todos estos
01:01:12
que fijaros es WindowsOpened, cuando se abre la ventana, cuando se está
01:01:16
cerrando, cuando se ha cerrado, bueno pues más cosas
01:01:20
Si queréis, tenemos un poquito curiosidad de lo que pasa en cada una de ellas, podemos poner aquí un system out para ver cuándo se producen, ponemos aquí pasando por y así vemos cuándo se producen esos eventos, vamos a pegarlo en todos y ahora lo cambiamos, un montón de métodos ha metido aquí esta interfaz, todos ellos relativos a window, porque todos ellos tienen que ver con el listener de window,
01:01:25
veis, por aquí, entonces
01:02:03
para ver cuando se ejecuta cada uno de ellos vamos a
01:02:06
modificar los system out
01:02:08
vamos a poner pasando por y el
01:02:10
nombre del método en el system
01:02:12
out, println, bueno pues ahí los
01:02:14
tenemos y ahora si ejecutamos por aquí
01:02:26
mirad, el arranque y el
01:02:28
mostrar la ventana ha pasado ya
01:02:31
el window listener me ha
01:02:33
ejecutado porque estaba la escucha
01:02:36
de cosas que pudieran pasar en esta ventana
01:02:38
los métodos pasando
01:02:39
por windows opened y por
01:02:42
windows activated
01:02:43
¿Qué sucede si ha pasado por estos? Que ahí podríamos nosotros poner cierto código que en nuestro diseño de la aplicación fuera necesario en el momento en el que esta ventana se está abriendo. Escribir en una base de datos, no sé qué, enviar tal o inicializar no sé qué variable, en el momento que esto pasa, pues ya sabemos que cuando arranca esta ventana, estos dos métodos, fijaros, se han ejecutado.
01:02:44
porque nos ha sacado los System of Printed Learning.
01:03:08
Mira, si yo pulso aquí, a la hora de cerrar, sobre el ASPA, se me ha cerrado, el programa nos ha cerrado.
01:03:11
Antes no parecía que tuviéramos posibilidad de hacer cosas, pero fijaros que se me han ejecutado estos dos métodos,
01:03:18
pasando por Windows Closing.
01:03:24
Bueno, pues ahí tenemos la posibilidad de meter código sobre algo que pase cuando pulsemos la cruz.
01:03:30
En cualquier caso, además de ejecutarse el Windows Closing y Windows Closed, la ventana se ha cerrado. El comportamiento que puede tener la ventana cuando pulsamos la cruz se lo podemos preestablecer también con una opción aquí.
01:03:37
Si decimos this, la ventana, punto, set default close operation, quiero que hagas por defecto cuando te cierres esto, si ponemos aquí un this nos da algunas alternativas.
01:03:59
fijaros, podemos poner dispose on close, desaparece cuando te cierres, también podemos decir un do nothing on close, no hagas nada cuando te cierres, podemos poner un hide on close, que yo creo es la que debe tener por defecto, es decir, se esconde, si es dispose, liberaría la memoria RAM de las tres que hemos visto, se cerraría la ventana, liberaría la memoria RAM asociada al objeto S que tiene que ver con la ventana,
01:04:18
un hide on close, lo que haría sería poner un set visible a false, pero la ventana
01:04:50
seguiría existiendo, y un do nothing on close,
01:04:54
pues no haría nada. Entonces, vamos a seleccionar, yo creo, no sé por
01:04:58
defecto si estará el dispose o el hide on close,
01:05:02
pero si ponemos un do nothing on close como comportamiento por defecto cuando la ventana
01:05:06
se cierre, si ahora ejecutamos, fijaros
01:05:10
que al pulsar sobre la cruz, me pasa por el
01:05:16
Windows Close It, tengo una zona de código que sí que salta el evento
01:05:19
porque he hecho esto, pero la ventana no se cierra.
01:05:25
¿Qué posibilidades tengo con esto? Pues mirad, como ya no se cierra
01:05:30
la ventana y sigue activa y me está pasando por aquí, yo aquí voy
01:05:36
a poder poner, por ejemplo, una ventanita diciendo, oye, ¿estás seguro
01:05:42
que quieres cerrar la aplicación? O imaginaros que tuviera ciertos
01:05:46
campos que estamos introduciendo datos
01:05:51
me he creado una variable
01:05:54
donde si se produce
01:05:56
algún cambio, la pongo a true
01:05:57
y ahora podría decir, si se ha producido
01:05:59
algún cambio, ¿quieres salvarlos
01:06:01
antes de cerrar la ventana?
01:06:03
si, no, cancelar, es decir, me da opciones
01:06:05
en el momento en el que se está cerrando la ventana
01:06:07
de hacer cosas, aquí
01:06:09
vamos a poner una ventanita
01:06:11
de mensaje para decirle, oye
01:06:15
¿seguro que quieres que se cierre
01:06:17
o no?
01:06:19
entonces, igual que antes hemos puesto una J
01:06:21
option pane por aquí, mostrando un mensaje, un show message dialog, pues ahora vamos a
01:06:23
mostrar un j, option pane, punto, y lo que vamos a hacer en lugar de mostrar un mensaje,
01:06:31
lo que vamos a hacer va a ser mostrar un show confirm dialog, que fijaros ahí está sobrescrito
01:06:41
con muchas alternativas. Aquí me ofrece de primeras una con dos valores. Vamos a utilizar una que permite
01:06:51
cuatro parámetros. Ahora después ponemos unos strings que tengan sentido con esto que estamos poniendo aquí.
01:07:02
Vamos a poner de momento esto para ver dónde se nos dibujan las as y las ver dentro de la ventana.
01:07:10
Y aquí podemos coger y poner J, Option, Paint. Fijaros, es la misma clase que esta, que tiene una serie de métodos, pero también tiene una serie de atributos. Y aquí podemos seleccionar esta ventanita que Opciones nos muestre. Por ejemplo, que simplemente tenga la opción de Cancelar, Default, Options.
01:07:14
Y una de ellas, por ejemplo, es la Yes, No. Esta nos da, ofrece dos botones. Dice sí o no. Quieres cerrar sí o no. Esta nos ofrece tres botones. Los botones sí, no y cancelar. Esta solamente la sí. Vamos a poner la sí, no opción. Y vamos a ejecutar. Un momento. Luego seguimos desarrollándolo más.
01:07:37
si yo pulso ahora aquí, fijaros, me sale esta ventanita que me dice BBBB, veis aquí, pues para poner un índice aquí arriba y aquí un mensajito en las as
01:08:04
y como hemos dicho que la opción que queremos es las yes no option, me ofrece la posibilidad de yes y no, pulso igual que dar dos cosas y no pasa gran cosa
01:08:17
ahora vemos cómo lo manejamos, si me vengo por aquí, como tenemos el dispose, sí que acaba la aplicación
01:08:27
entonces aquí decidiríamos seguro que quieres cerrar y aquí ponemos
01:08:34
msg cierre y esta ventana con las opciones sino la idea es que podamos capturar información de
01:08:46
si queremos cerrar o no mirad entonces este método no se va a estar devolviendo un entero
01:08:58
que vamos a mostrar aquí por pantalla, vamos a poner un system.out.println
01:09:04
lo que estoy metiendo es un system.out.println lo que nos devuelve
01:09:12
la ventanita esta, lanzará la ventana, cuando le demos así o no
01:09:22
el método devolverá un valor entero y lo estamos mostrando por pantalla
01:09:29
podremos buscar la información o podemos de esta forma ver que nos devuelve en cada caso
01:09:34
si le doy a ejecutar
01:09:39
pulso aquí
01:09:42
mirad, me ha sacado aquí los eventos
01:09:44
si pulso sí
01:09:47
me devuelve un 0, ¿veis?
01:09:48
y si pulso no, me devuelve un 1
01:09:52
no, un 1, sí un 0
01:09:54
¿seguro que quiere cerrar?
01:09:58
pues entonces, fijaros, a ver
01:10:00
aquí que podría hacer en el Windows
01:10:02
Closing, pues podría decir if
01:10:06
voy a capturar esto en un entero
01:10:08
int if val
01:10:18
devuelto
01:10:20
digo, esto que estoy, el sí y el no, que me volvió un cero y uno que mostraba por pantalla, ahora lo estoy cargando aquí en esta variable, entonces digo, sí, lo que me ha devuelto es un cero, pues entiendo que me ha devuelto que sí, quiere cerrar, entonces con un sí quiere cerrar, qué código hemos puesto aquí para que se cerrara la ventana antes, fijaros, teníamos el dispose o el system.exe cero, aquí podemos poner esto,
01:10:22
else
01:11:00
bueno
01:11:02
pues
01:11:04
pues nada, pues en realidad no queremos
01:11:05
hacer nada, porque no queremos que se cierre
01:11:08
si queréis que completemos aquí podemos
01:11:10
poner un system.ln
01:11:12
y ponemos aquí
01:11:13
cancelado proceso
01:11:17
de cierre, me he arrepentido
01:11:21
de cerrar, le doy aquí
01:11:29
dices
01:11:30
no, no se cierra la ventana
01:11:32
y fijaros como dice
01:11:35
cancelado, repuesto, cancelado, proceso de cierre.
01:11:36
Y si ahora doy aquí, por aquí también, yo resalto ese mismo evento
01:11:39
y digo, yes, sí, pues la ventana se cierra.
01:11:43
¿Por qué? Porque en ese caso ha entrado por aquí, por el system exit.
01:11:46
Se ha cerrado la aplicación entera en sí.
01:11:49
Diferentes componentes, en este caso el componente ventana,
01:11:54
trabaja con un listener un poquito distinto,
01:11:58
que te mete una serie de métodos.
01:12:00
¿Por qué mete estos métodos?
01:12:03
Porque son los que hemos acordado para esta interfaz.
01:12:05
para este WindowsListener, ahí los tenéis todos
01:12:08
y luego en función de cuando queramos que pasen cosas
01:12:14
en cada uno de estos métodos metemos código, en este caso
01:12:19
nos ha interesado cuando se producía el método WindowsClosing
01:12:23
por defecto la ventana seguro que se cierra
01:12:27
no sé si hace un dispose o un hide, no sé si se esconde o libera toda la memoria RAM
01:12:31
que tenía esa ventana, pero el programa no se cerraba en sí, si queremos
01:12:35
que la ventana no se cierre para tener cierto control aquí de, antes de que se cierre
01:12:39
que pasen algunas cosas, tenemos la posibilidad de indicar
01:12:43
el comportamiento que va a tener este objeto
01:12:47
que este objeto, recordad que es el JFrame, cuando se cierre
01:12:50
que en este caso hemos indicado que sea this do nothing on close, no hagas nada
01:12:55
cuando se cierre, pero, no hagas nada, pero saca los eventos
01:12:59
los eventos si que se lanzan, zona de código donde podemos trabajar nosotros
01:13:03
hay tantas cosas que contar con las ventanas
01:13:07
pero bueno, un poco como para que os dé pistas
01:13:18
luego todos se van comportando de formas
01:13:21
más o menos parecidas
01:13:23
conceptualmente, otra cosita que os comentaba
01:13:26
todo el rato, estamos metiendo los listener
01:13:31
en this, es como this, es esta clase
01:13:32
en esta misma clase estamos poniendo
01:13:36
esto es decir, en esta clase estamos definiendo
01:13:38
el dibujo de la ventana y estamos definiendo el comportamiento
01:13:41
que tienen sus componentes. Pero bueno, por diseño también podríamos decir
01:13:46
pues mira, quiero dedicar unas cosas al dibujo y otras cosas
01:13:50
una clase al dibujo y otra clase diferente al comportamiento
01:13:53
de tal forma que si luego tengo que hacer una actualización en mi proyecto
01:13:58
si lo que quiero es que un componente me salga con otro color o más
01:14:02
desplazado a la derecha o a la izquierda, pues me voy a
01:14:06
tengo muy localizado cómo trabajar eso en la clase
01:14:09
donde lo estoy dibujando. En cambio, si lo que quiero es
01:14:13
que antes guardaba cierta información al pulsar un botón, la guardaba en un fichero
01:14:17
y ahora, además de en el fichero, tengo que escribir una base de datos o solo en la base de datos
01:14:21
o no escribir o cambiar el formato de lo que escribo, no quiero
01:14:25
arriesgarme a tocar la clase donde lo estoy dibujando, no es así que empiece a
01:14:29
mezclar cosas por ahí y se me descuadre todo. Quiero tener bien separadito
01:14:33
el comportamiento del dibujo. Pues eso, ¿cómo lo podemos hacer?
01:14:37
Pues fijaros, para cualquiera de ellos, me da igual,
01:14:42
para el botón 2, vamos a decir que se defina en otra clase.
01:14:45
Fijaros que el botón 2, teníamos aquí puesto el dis,
01:14:51
para que fuese en esta clase. Entonces, aquí lo que vamos a hacer
01:14:54
en nuestro proyecto es crear una nueva clase,
01:14:57
que sea, la llamamos como sea, vamos a llamarla
01:14:59
compor botón 2
01:15:04
aquí cogemos y decimos que creamos un objeto de esta clase
01:15:09
y ahora el botón 2 cuando se produzca
01:15:18
una acción sobre este botón en lugar de decir que
01:15:39
lo capture esta ventana principal lo que vamos a decir
01:15:43
va a ser que el botón 2 lo capture este otro objeto
01:15:47
cuando se produzca una acción sobre este botón ya no se va
01:15:51
a venir al método ActionPerformance y lo que he pulsado ha sido el botón 2, porque no estoy
01:15:58
diciendo que sea esta clase lo que haga, sino que se va a ir a un ActionPerformance que tendrá que
01:16:06
estar definido en este botón 2. ¿Por qué no me compila? Pues porque botón 2 no está implementando
01:16:10
ese Listener. Entonces, si no venimos aquí, hacer copy-pega para que sea más rápido, digo
01:16:15
implementame ese Listener y ahora digo, mete los métodos no implementados, me pone este aquí el
01:16:21
acción performance, si pongo ya aquí un system.out.println, botón 2 pulsado, en, vamos a ponerlo aquí
01:16:32
para que quede claro que es ahí, si yo ahora ejecuto y pulso el botón 2, fijaros como me dice botón 2
01:16:50
pulsado en comport botón 2, donde he derivado el comportamiento de los componentes
01:17:01
No, en particular este componente, cuando se produce un evento sobre él, lo he derivado a este objeto en lugar de a dis.
01:17:10
Antes era a dis en todos los casos, por eso lo implementábamos en esta misma clase.
01:17:20
Bueno, ahora hay una clase encargada de gestionar el comportamiento del botón 2 cuando se ha pulsado.
01:17:24
Por eso al ActionListener le he dicho que sea este objeto, que es un objeto de la clase.
01:17:31
con por si no se ve decirme a ver si tengo por aquí anotar alguna anotación otra cosilla que
01:17:35
os iba a contar porque es que esto el aparte de añadir los listener también se puede meter otro
01:17:56
hacer que hereden las clases de una acción performance si localizó si localizó donde
01:18:05
tengo alguna anotación por aquí de esto
01:18:14
si no lo intentamos hacer en cualquier caso
01:18:16
bueno
01:18:20
sí
01:18:21
bueno, en línea
01:18:26
general es que yo os diría
01:18:36
que un poco
01:18:39
o sea
01:18:40
bueno, yo que sé un poco, a ver
01:18:41
alguna cosa de colecciones, pues alguna cosa
01:18:46
de colecciones, pues caerá
01:18:49
seguramente, alguna cosa de
01:18:51
algún ficherito para escribir o leer
01:18:53
pues también, caer alguna cosa de esas
01:18:55
y
01:18:57
de estos últimos dos temas
01:18:58
pues como os decía, si andáis
01:19:01
muy sobrados de tiempo
01:19:03
pues miradlos
01:19:05
y si no andáis sobrados de tiempo
01:19:07
tampoco lo miréis mucho porque será
01:19:09
muy poco
01:19:11
el peso que tendrá en el examen
01:19:12
y luego
01:19:15
bueno, pues todo lo demás al final
01:19:17
si es que hace falta para todo
01:19:18
que si los bucles, que si los arraes
01:19:20
al final todo más o menos
01:19:23
hasta el momento en el que hemos llegado
01:19:25
a colecciones
01:19:28
bueno, también están las excepciones
01:19:29
las excepciones quizás
01:19:32
no tengan tanta
01:19:34
trascendencia como quizás las colecciones
01:19:36
o los ficheros, pero hasta el momento que
01:19:38
hemos llegado a esto
01:19:40
es que todo es imprescindible para cualquier
01:19:41
programa, manejar los bucles
01:19:44
un poco, manejar
01:19:46
los condicionales
01:19:47
el examen está estructurado
01:19:50
pues en línea general es un poco como el de febrero
01:19:53
tiene algunas preguntas así iniciales
01:19:57
que tipo T es
01:20:00
os acordáis también que en febrero también lo teníamos así
01:20:02
y luego pues se hace un planteamiento
01:20:06
así un poco general de un ejercicio
01:20:09
y sobre ese ejercicio pues se preguntan
01:20:11
pequeñas parcelas, ¿cómo harías esto? ¿cómo harías esto otro?
01:20:15
y entonces pues para hacer esas cosas pues tendréis
01:20:19
que en algún caso hacer alguna colección
01:20:21
o escribir en algún fichero.
01:20:24
Un poquito esto.
01:20:28
Quizás es un poco genérico y no te preciso mucho,
01:20:33
pero es que es un poco esto.
01:20:36
O no sé si tienes alguna duda así particular.
01:20:40
Bueno, un poco la idea.
01:20:44
Ya te digo, tendrá una pequeña parte ahí con preguntas tipo test
01:20:46
y luego para que escribáis ahí un poco en el código
01:20:50
Os daremos también el chuletario, el mismo que tuvimos en el examen de febrero y que para los que no hayáis venido al examen de febrero, aunque no lo tenéis que traer porque os lo daremos, pero está colgado en el aula virtual para que os familiaricéis un poco con él.
01:20:55
aquel chuletario de febrero incluía estas cosas de las colecciones
01:21:10
si echáis alguna cosa en el chuletario muy en falta
01:21:17
pues decírmelo a ver si nos da tiempo de incorporarlo
01:21:20
de aquí al próximo día
01:21:22
pero bueno, ese mismo chuletario lo venimos usando desde hace años
01:21:24
y en principio yo creo que es un buen resumen
01:21:28
para no tener que acordarse de toda la sintaxis de las cosas
01:21:32
y bueno, pues un poco
01:21:36
esto os puedo contar
01:21:38
no, pero bueno, esto
01:21:40
yo qué sé, sí, más o menos
01:21:48
esto, no sé
01:21:51
sí, y
01:21:52
nada, bueno, pues eso, para el examen
01:21:58
ya os pondré un mensajillo
01:22:00
también un poco recordando, pero bueno
01:22:01
las cosas un poco lógicas, acordaros
01:22:03
de traeros algo que os identifique
01:22:05
porque como tenemos que pasar lista
01:22:07
y bueno, los bolis y poco más
01:22:09
y mucho ánimo
01:22:11
En el examen, si no os quedáis con preguntas, esto siempre os lo digo, si hay cosas que no estáis entendiendo en el examen, preguntadme. Yo valoraré ya si la pregunta sobrepasa un poco lo que os puedo contar o no, pero a lo mejor sí que lo que me estáis preguntando es algo de que os puedo aclarar alguna cosilla y os permite tirar en el examen.
01:22:13
O sea, que no os quedéis con la duda en el cuerpo, que para, como cuando sales por ahí a dar una vuelta, él no siempre lo tiene, ¿no? Pues ya está, pues pregunta si os puedo contar algo de la duda que tengáis, os la aclaro y si me parece que ya no, pues ya os digo, pues no hombre, eso yo creo que lo tendrías que saber, pero vamos, que no se quede la duda ahí pendiente.
01:22:35
y no sé del examen poco a poco más como yo creo que os puedo contar con incluyendo los nuevos
01:22:53
contenidos pues un examen en cuanto a esquema muy muy parecido al de al de febrero en cuanto
01:23:06
a la estructura y esto claro incluyendo ya por las nuevas partes que hemos visto desde entonces
01:23:14
bueno mirad os meto métodos si os parece lo de la acción performance a ver si nos funciona
01:23:19
y tampoco damos muchas más vueltas porque
01:23:33
luego podemos añadir mucho más incluyendo
01:23:36
nuevos componentes por aquí
01:23:41
pero que más o menos, ya os digo, la idea es
01:23:45
con una sintaxis un poco distinta que se puede buscar por ahí
01:23:49
añades el dibujo, le metes un listener, lo metes para el comportamiento
01:23:52
y luego cada vez que actuemos sobre él se ejecuta una zona de código
01:23:57
que es donde metemos el código en particular. Lo que os decía es que también nos da la posibilidad
01:24:01
es en lugar de poner un implement action listener, vamos a hacerlo para la ventana.
01:24:12
Fijaros, hemos metido aquí el implement action listener que nos ha obligado a meter todo esto
01:24:23
y la ventana le hemos dicho un dis, entonces aquí a la ventana donde le hemos dicho aquí el dis,
01:24:27
vamos a decir que también sea este mismo objeto el que tenga en consideración los eventos de la
01:24:40
ventana, es decir que en lugar de saltar estas zonas de código cuando hagamos algo sobre la
01:24:46
ventana salte en la zona de código en este objeto. ¿Qué tendríamos que hacer? Pues nos vendríamos
01:24:53
aquí poner el Implements Window Listener pero en las librerías de Java aparte de los Listener
01:24:59
estos como interfaces tenemos la posibilidad de en lugar de utilizar eso hacer que herede de
01:25:06
windows adapter en lugar de listener windows adapter fijaros que ahora ya no implementamos
01:25:14
sino que heredamos y ahora fijaros que incluso quitando esto me compila o no me compila bueno
01:25:27
no, porque este era de este, vale. El que acabo de borrar era del
01:25:39
listener, no del adapter. Fijaros que el WindowsListener aquí
01:25:43
me había obligado para que compilase a meter todos estos métodos.
01:25:46
En cambio, aquí lo que hemos hecho ha sido un stents, una herencia.
01:25:53
Entonces, todos esos métodos vacíos están ya aquí
01:25:57
disponibles en el adaptador. De tal forma que
01:26:00
ya existen en esta clase todos los métodos
01:26:03
que aquí teníamos
01:26:08
definidos con el
01:26:10
Windows Listener
01:26:14
como interfaz, pero están vacíos.
01:26:16
¿Qué necesitamos hacer? Lo que necesitamos hacer es
01:26:20
que para que todos esos
01:26:23
métodos tengan algún sentido, sobrescribirlos.
01:26:26
Esta clase los tiene disponibles vacíos y aquí los podemos
01:26:28
sobrescribir. Pero si solamente
01:26:31
estamos utilizando el Windows Closing
01:26:35
en lugar de sobrescribir todos, que en realidad
01:26:37
con el interfaz me ha obligado a ponerlos pero vacíos, el único que sobrescribo
01:26:42
es este. Entonces se va a comportar cuando hagamos un Windows Closing
01:26:47
según esto y los demás no los tengo que escribir.
01:26:52
El Windows Listener, como es un interfaz, me obliga a meter todos dentro de esta clase
01:26:56
porque en realidad son abstractos esos métodos en el interfaz
01:27:00
pero el Windows Adapter es una clase que los tiene
01:27:04
desarrollados, pero vacíos. Todos ya existen, me compila, pero no
01:27:10
hacen nada. Si quiero que haga algo, alguno de ellos, en este método
01:27:14
tengo que sobrescribirlo. Y todos los demás vacíos no los tengo que sobrescribir y tienen
01:27:18
su comportamiento vacíos, igual que aquí los tenía este.
01:27:22
Entonces, para tener claro que está pasando por aquí,
01:27:31
porque se lo hemos dicho aquí al incluir
01:27:36
el AddWindowListener, hemos dicho
01:27:40
que sea este objeto y no di ya a quien
01:27:43
capture
01:27:45
los eventos relacionados con la
01:27:47
ventana, para
01:27:49
tener claro que pasa por aquí, en lugar de pasando
01:27:51
por Windows Closing, vamos a poner pasando por
01:27:53
Windows Closing de la clase
01:27:55
con por botón
01:27:58
2, en lugar de
01:27:59
el que nos salía antes, que sería
01:28:01
este, pasando por
01:28:03
Windows Closing, pues ahora para tener certeza
01:28:05
que es por este, ponemos pasando por
01:28:07
Windows Closing con por botón
01:28:09
2, entonces damos aquí
01:28:11
veis y ya me dice pasando por windows cruz en con por botón 2 que es que es vamos en lo
01:28:17
previsible que tiene que pasar porque lo que le hemos dicho aquí que es esta clase ahora la que
01:28:23
se encarga de los eventos relacionados con la ventana donde lo tenemos y bueno por aquí tenía
01:28:28
un montón de controles más para mostraros pero pero yo creo que no voy a arrancar ya porque ya
01:28:44
nos falta poco rato y no nos va a dar tiempo a meter muchos más queréis que de aquí de esto de
01:28:50
las ventanas o de el resto de los contenidos del curso alguna duda así seria que queréis que
01:29:00
comentemos o algo de eso cualquier caso estoy pendiente estos días también de de los foros
01:29:07
por si acaso me queréis preguntar alguna cosita diferente y os pongo un mensaje antes de del
01:29:19
examen que no recuerdo si es el miércoles cuando lo tenemos pues os pongo un mensajillo también
01:29:26
recordando un poco las diferentes cosas
01:29:33
para el día del examen. ¿Alguna cosita
01:29:35
más? ¿Os parece
01:29:43
que vayamos cerrando entonces por hoy?
01:29:45
Bueno, si no, me decís
01:29:53
nada nuevo.
01:29:54
Que tengáis mucha suerte esta semana
01:29:56
de exámenes y a ver si os quitáis
01:29:58
todas o la mayor parte de ellas.
01:29:59
Y nada,
01:30:03
nos mantenemos en contacto estos días.
01:30:04
Venga, pues nada.
01:30:10
Buena tarde a todos.
01:30:10
Os dejo
01:30:14
también colgada esta clase
01:30:14
ahí en el curso de Lola Virtual.
01:30:16
Venga, hasta luego.
01:30:20
Buena tarde.
01:30:21
Chao.
01:30:21
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- JM
- Subido por:
- Jose Manuel M.
- Licencia:
- Dominio público
- Visualizaciones:
- 20
- Fecha:
- 12 de mayo de 2025 - 19:09
- Visibilidad:
- Clave
- Centro:
- IES ALONSO DE AVELLANEDA
- Duración:
- 1h′ 30′ 24″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 202.71 MBytes