Vous êtes sur la page 1sur 26

Hola mundo

Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Layouts: Tipos

Hay varias elecciones a la hora de usar un layout, como siempre


depende de nuestras necesidades:
FlowLayout Para tener los componentes en una fila con su
tamaño natural. Es el layout por defecto.
BorderLayout Se usa si queremos que los componentes
ocupen todo el espacio libre.
GridLayout Componentes de mismo tamaño distribuidos en
filas y columnas.
BoxLayout Componentes en una fila o columa con diferentes
espacios entre ellos, distintas alineaciones o tamaños.
GribBagLayout y SpringLayout Si tenemos un escenario
complejo y queremos mucho control sobre como se disponen
los elementos.
235 [234 - 237] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Layouts: FlowLayout

Cuando un contenedor tienen un FlowLayout añadimos


elementos en el usando add(componente).
Los elementos se distribuyen en fila si variar su tamaño.
Es el layout por defecto.

236 [234 - 237] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Layouts: BorderLayout

Se divide el contenedor en 5 regiones:


PAGE START Parte superior del contenedor
PAGE END Parte inferior del contenedor
LINE START Parte izquierdadel contenedor
LINE END Parte derecha del contenedor
CENTER Centro del contenedor
Los elementos ocupan todo el espacio posible (se cambia su
tamaño para logarlo) incluso si se modifica el tamaño de la
ventana.
Para añadir elementos se usa add(componente,
BorderLayout.REGION) donde REGION es una de las
regiones anteriores.
237 [234 - 237] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Ejercicio

Crearemos un mini editor de texto.


Usaremos lo aprendido de entrada/salida de ficheros.
Leemos un fichero y escribimos su contenido en un JTextArea.
Usar un BorderLayout.

JTextArea
Podemos usar el método setText(String t) para poner todo el
texto o append(String t) para ir añadiendo poco a poco.
Con getText() obtenemos todo el texto que contiene.

238 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Dialogo de apertura de fichero

Con JFileChooser tenemos un dialogo que pide un fichero:


J F i l e C h o o s e r c h o o s e r = new J F i l e C h o o s e r ( ) ;
i n t r e t u r n V a l = c h o o s e r . showOpenDialog ( f r a m e ) ;
i f ( r e t u r n V a l == J F i l e C h o o s e r . APPROVE OPTION) {
try {
leeFichero (
chooser . g e t S e l e c t e d F i l e ( ) . getAbsolutePath ( ) ) ;
} catch ( E x c e p t i o n ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
}
}
Como podemos con getSelectedFile() nos devuelve un objeto
File que representa el fichero elejido.
239 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Acciones

Podemos establecer el comportamiento de un botón usando


acciones.
b u t t o n . s e t A c t i o n ( new A c t i o n A b r i r ( ) ) ;
Para ello creamos una subclase de AbstractAction e
implementamos el método actionPerformed

240 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Acciones

c l a s s ActionAbrir extends AbstractAction {


public ActionAbrir () {
super ( ” Abrir ” ) ;
}

public void actionPerformed ( ActionEvent e ) {


J F i l e C h o o s e r c h o o s e r = new J F i l e C h o o s e r ( ) ;
i n t r e t u r n V a l = c h o o s e r . s ho wO pe nD i a l o g ( f r a m e ) ;
i f ( r e t u r n V a l == J F i l e C h o o s e r . APPROVE OPTION) {
try {
leeFichero (
chooser . g e t S e l e c t e d F i l e ( ) . getAbsolutePath ( ) )
} catch ( E x c e p t i o n ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
}
}
}
241 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Menu

Podemos añadir menus a las ventanas. Para ellos creamos un


JMenuBar y se lo añadimos al JFrame haciendo
setJMenuBar(menu)
El JMenuBar está formado por elementos JMenu
Los JMenu contienen elementos del tipo JMenuItem
Los JMenuItem reciben como argumento una acción.

242 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Menu

JMenuBar menuBar = new JMenuBar ( ) ;


JMenu menu = new JMenu ( ” F i c h e r o ” ) ;
menu . add ( new JMenuItem ( new A c t i o n A b r i r ( ) ) ) ;
menu . add ( new JMenuItem ( new A c t i o n G u a r d a r ( ) ) ) ;

menuBar . add ( menu ) ;

f r a m e . addJMenuBar ( menuBar ) ;

243 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Popup

Además podemos añadir un menu popup a nuestro editor.


Usamos un JPopupMenu
Son parecidos a los JMenu, contienen JMenuItem
Para hacer que aparezca al pulsar el botón derecho tenemos
que registrarnos en los eventos del ratón.
Usamos el método addMouseListener que espera recibir un
MouseListener. Podemos extender la clase MouseAdapter y
anular los métodos que nos interesan.

244 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Popup

c l a s s P o p u p L i s t e n e r extends MouseAdapter {
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) {
maybeShowPopup ( e ) ;
}

p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ) {
maybeShowPopup ( e ) ;
}

p r i v a t e v o i d maybeShowPopup ( MouseEvent e ) {
i f ( e . isPopupTrigger ()) {
popup . show ( e . getComponent ( ) ,
e . getX ( ) , e . getY ( ) ) ;
}
245 [238 - 246] } Varela Paz (cvarela@dc.fi.udc.es)
Carlos Introducción al lenguaje de programación Java
Hola mundo
Threads
Mini-aplicación
Entrada/Salida
Entrada de datos
Interfaces Gráficas de usuario
Layouts
Interfaces Gráficas de usuario II
Ejercicio

Interfaces Gráficas de usuario


Popup

Con e.isPopupTrigger() sabemos si es el evento de mostrar


el popup en la plataforma en la que se ejecuta la aplicación
Añadimos el evento al JTextArea
texto . addMouseListener (
new P o p u p L i s t e n e r ( ) ) ;

246 [238 - 246] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Índice

8 Interfaces Gráficas de usuario II


Checkboxes
Botones de radio
ComboBox
Imágenes
Tabs
SplitPane
Rendimiento

247 [247 - 247] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Checkboxes

Un checkbox es un botón especializado que muestra un estado


de selección.
Suele utilizarse para seleccionar opciones en una interfaz
En Java se representa con la clase JCheckBox
Para crear uno se hace:
JCheckBox ck = new JCheckBox ( ” Opcion 1” ) ;
La cadena de texto es el texto que aparecerá al lado de la
marca de selección
Para conocer el estado usamos isSelected()
Si queremos modificarlo explı́citamente usamos
setSelected(boolean b)
248 [248 - 248] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Botones de radio

Con checkboxes podemos hacer elegir entre varias opciones


Si queremos que esas opciones sean excluyentes se suelen
utilizar botones de radio
Representados con la clase JRadioButton
Para crear uno se hace:
J R a d i o B u t t o n ck = new J R a d i o B u t t o n ( ” Opcion 1” ) ;
La cadena de texto es el texto que aparecerá al lado de la
marca de selección
Para conocer el estado usamos isSelected()
Si queremos modificarlo explı́citamente usamos
setSelected(boolean b)
249 [249 - 250] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Botones de radio

Para lograr un comportamiento exclusivo (sólo uno de los


botones está seleccionado) se usa ButtonGroup
Esta clase se encarga de que sólo un botón se encuentre
seleccionado en cada momento

ButtonGroup g r u p o = new ButtonGroup ( ) ;


g r u p o . add ( r b 1 ) ;
g r u p o . add ( r b 2 ) ;

250 [249 - 250] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


ComboBox

Con las comboboxes podemos seleccionar un elemento de una


lista.
Se usa la clase JComboBox
Podemos inicializar un combobox haciendo:
String animales [ ] =
{” P e r r o ” , ” Gato ” , ” P o l l o ” } ;
JComboBox cb = new JComboBox ( a n i m a l e s ) ;
Con setSelectedIndex(int i) indicamos qué elemento
queremos que aparezca seleccionado
Podemos registrar un ActionListener para saber cuando se
selecciona un elemento.
251 [251 - 251] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Imágenes

El tratamiento de imágenes en Java es un mundo por si solo.


Veremos una forma sencilla de visualizar imágenes en nuestra
interfaz.
Usaremos un objeto ImageIcon y se lo asociaremos a un
JLabel para que dibuje la imagen.
Para crear un ImageIcon hacemos:
j a v a . n e t . URL imgURL =
NombreDeClase . c l a s s . g e t R e s o u r c e ( p a t h ) ;
I m a g e I c o n i = new I m a g e I c o n ( imgURL ) ;
Ahora podemos asignar el icono al JLabel:
J L a b e l l = new J L a b e l ( ) ;
l . setIcon ( i );
252 [252 - 253] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Imágenes

j a v a . n e t . URL imgURL =
NombreDeClase . c l a s s . g e t R e s o u r c e ( p a t h ) ;
El método getResource hace que el cargador de clases busque en
los directorios del classpath y en los .jar y devuelva una URL con la
dirección del fichero.

253 [252 - 253] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Tabs

En las interfaces gráficas es común ver solapas que al


pincharlas muestran un contenido.
En Java se puede utilizar un contenedor especial para lograr
ese efecto: JTabbedPane
Para añadir elementos al panel se usa el método addTab que
creará una nueva solapa:
JTabbedPane p = new JTabbedPane ( ) ;
p . addTab ( ” T i t u l o ” , componente ) ;

254 [254 - 255] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Tabs: Orientación

Podemos cambiar e lugar en el que aparecen las solapas usando el


método setTabPlacement(int placement), el parámetro puede
valer:
JTabbedPane.TOP
JTabbedPane.BOTTOM;
JTabbedPane.LEFT
JTabbedPane.RIGHT

255 [254 - 255] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


SplitPane

Con un JSplitPane creamos un contenedor dividido en dos


paneles.
Para indicar los componentes que van a cada lado se usan los
métodos setRightComponent(Component c) y
setLeftComponent(Component c)
Ahora podemos modificar el tamaño de los paneles con el
ratón moviendo la barra divisora.

256 [256 - 257] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


SplitPane

Podemos cambiar la orientación de la barra de división


utilizando el método setOrientation(int orientation).
Los valores permitidos son:
JSplitPane.VERTICAL SPLIT
JSplitPane.HORIZONTAL SPLIT
Si se usa JSplitPane.HORIZONTAL SPLIT podemos añadir
los componentes usando setTopComponent(Component
comp) y setBottomComponent(Component comp)

257 [256 - 257] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Rendimiento

Ya comentamos que los eventos se manejan en el thread de


eventos y que se tratan secuencialmente.
Además sabemos que el dibujado tambien ocurre ahı́.
¿Que sucede si hacemos una operación muy costosa en un evento?
La interfaz queda bloqueada hasta que la operación termine.
Puede haber distintas operaciones costosas:
Cargar una imagen grande.
Hacer peticiones a una base de datos remota.
Realizar un cálculo complejo
...
258 [258 - 260] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Rendimiento

Es este tipo de casos deberiamos:


Crear un thread que realice la operación que tarda
Al terminar actualizar la interfaz usando
SwingUtilities.invokeLater(...)
En los tutoriales de Sun nos proporcionan una clase SwingWorker
que hace esto por nosotros. Para usarla hay que:
Crear una subclase de SwingWorker.
Anular el método construct() poniendo el código costoso
Anular el método finished() poniendo el código de
actualización de la interfaz.

259 [258 - 260] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java
Checkboxes
Botones de radio
Threads
ComboBox
Entrada/Salida
Imágenes
Interfaces Gráficas de usuario
Tabs
Interfaces Gráficas de usuario II
SplitPane
Rendimiento

Interfaces Gráficas de usuario II


Rendimiento

contruct() de vuelve un Object que puede ser utilizado el


mètodo getValue()
getValue() espera a que el thread generado en
construct() termine si no habı́a terminado.
SwingWorker w o r k e r = new SwingWorker ( ) {
p u b li c Object c o ns tr uc t () {
// Hemos una o p e r a c i o n c o s t o s i i i i i i m a
return resultado ;
}
// Se e j e c u t a en e l t h r e a d de e v e n t o s .
public void f i n i s h e d () {
Object r = getValue ( ) ;
// A c t u a l i z a m o s l a i n t e r f a z u s a n d o e l v a l o r
}
};
worker . s t a r t ( ) ;
260 [258 - 260] Carlos Varela Paz (cvarela@dc.fi.udc.es) Introducción al lenguaje de programación Java

Vous aimerez peut-être aussi