1. Elabora: Benjamín Joaquín Martínez
Investigación: Javax.swing
Awt de java
JOptionPane
https://www.linkedin.com/in/benjaminjoaquinmartinez/
Javax.swing
En el casode Swing,esJavaquienvisualizay gestionalainteraccióndel usuariosobre loselementos
de la interface gráfica.
Existen clases con el mismo cometido tanto en AWT como en Swing. Por ejemplo, en ambas
bibliotecastenemosunaclase paracrearventanasFrame en el casode AWT y JFrame enel casode
Swing.
Existenotrasclasesque son del paquete AWTperose utilizanenSwing,porejemplo,loseventosy
escuchadores. Como no tienen representación gráfica, en Swing se reaprovechan los de AWT.
Swing es una biblioteca de clases que permite crear interfaces gráficas de usuario en Java.
Swingformaparte delpaqueteestándar,nohace faltaimportarningúnficheroadicionalennuestros
proyectos.
Swingestáorientadoaobjetos,yusael patrónde diseñoObservador/Observable parainformarde
las interacciones del usuario sobre la interface gráfica de usuario.
Contenedores y componentes
Existen dos elementos básicos para la creación de interfaces gráficas de usuario usando Swing:
Contenedores: Elementos capaces de albergar otros elementos.
Componentes: Elementos que se añaden a contenedores. Usualmente los componentes
tienen aspecto gráfico, como un botón.
Swing proporciona tres tipos de contenedores de alto nivel. Esto significa que, cualquier otro
contenedor que no sea de alto nivel, o componente, debe ir en su interior.
Estos tres contenedores de alto nivel son: JFrame, JDialog y JApplet
JFrame: Se visualiza como una ventana principal con marco y barra de título.
2. JDialog:Se visualizacomounaventanaindependientede laventana principal paramostrar
información, como por ejemplo el contenido de un directorio.
JApplet:Permite crearaplicacionesconinterface gráficaque se ejecutanenel contextode
un navegador web.
3. El primer ejemplo de contenedor: un JFrame:
JFrameventana=newJFrame("PrimeraVentana");
ventana.setSize(400,400);
ventana.setVisible(true);
Quizás, veamos ejemplos donde se extiende a la clase JFrame para crear la ventana:
publicclassVentanaextendsJFrame{
privateVentana(){
super("PrimeraVentana");
}
privatevoidejecuta(){
setSize(400,400);
setVisible(true);
}
publicstaticvoidmain(String[]args){
newVentana().ejecuta();
}
}
La desventaja de esta opción es que esta clase no puede extender a ninguna otra.
4. Una vezque hemoscreadouncontenedor,loscomponenteslosañadiremossiguiendolassiguientes
reglas:
Un componente se visualizará si lo hemos añadido a un contenedor.
Un componente sólo se puede añadir una vez a un contenedor.
Los componentes los debemos añadir al panel del contenedor.
Un primer componente, un botón.
JFrameventana=newJFrame("PrimeraVentana");
JButtonboton=newJButton("Unbotón");
ventana.getContentPane().add(boton);//Añadimosalpaneldelaventana.
ventana.setSize(400,400);
ventana.setVisible(true);
El botón lo añadimos al panel de la ventana principal.
El botón ocupa todo el tamaño de la ventana.
El botón se comporta como tal, pero no hace nada.
Para añadir componentes, u otros contenedores, a la ventana principal,hay que hacerlo sobre su
panel, y no directamente sobre la ventana.
Como programadores, no hace falta que nos ocupemos de la organización de los componentes
dentro de los contenedores.
Swing nos ofrece gestores de aspecto capaces de organizar, de manera automática, la posición y
tamaño de los componentes dentro de los contenedores.
Los contenedores tienenasignado, por defecto, alguno de estos gestores de aspecto. En el caso
de JFrame este gestor es BorderLayout.
5. Este esel comportamientode estegestordeaspecto.Define5zonas,encadaunade las cualessólo
podemos añadir un componente.
Si no existe alguna de las zonas, la central se extiende hasta ocupar toda la ventana.
6. El código para generar las imágenes anteriores:
JFrameventana=newJFrame("BorderLayoutManager");
Containercontenedor=ventana.getContentPane();
contenedor.add(newJButton("BorderLayout.CENTER"),
BorderLayout.CENTER);
contenedor.add(newJButton("BorderLayout.NORTH"),BorderLayout.NORTH);
contenedor.add(newJButton("BorderLayout.SOUTH"),BorderLayout.SOUTH);
contenedor.add(newJButton("BorderLayout.EAST"),BorderLayout.EAST);
contenedor.add(newJButton("BorderLayout.WEST"),BorderLayout.WEST);
ventana.setSize(500,500);
ventana.setVisible(true);
Otro contenedor muy utilizado es JPanel.
Este contenedor no tiene ningúnaspecto visual,sirve como contenedor de otros componenetes y
contenedores.
Por defecto, JPanel tiene un FlowLayout como gestor de aspecto.
FlowLayout distribuye los componentes de izquierda a derecha y de arriba hacia abajo, a medida
que los añadimos.
El código del ejemplo anterior:
JFrameventana=newJFrame("FlowLayoutManager");
Containercontenedor=ventana.getContentPane();
JPanelpanel=newJPanel();//Estepanelcontieneloscomponentes.
8. Existenotros gestoresdeaspecto,porejemplo GridLayoutnospermitecolocarloscomponentesen
una rejilla:
El código del ejemplo anterior:
JFrameventana=newJFrame("GridLayoutManager");
ventana.setLayout(newGridLayout(2,3));
Containercontenedor=ventana.getContentPane();
contenedor.add(newJButton("Uno"));
contenedor.add(newJButton("Dos"));
contenedor.add(newJButton("Tres"));
contenedor.add(newJButton("Cuatro"));
contenedor.add(newJButton("Cinco"));
ventana.setSize(500,500);
ventana.setVisible(true);
En este caso, la rejilla es 2 filas por 3 columnas.
9. BoxLayout nos permite colocar los componentes vertical u horizontalmente:
Por defecto, los componentes se alinean a la izquierda.
El código del ejemplo anterior;
JFrameventana=newJFrame("BoxLayoutManager");
Containercontenedor=ventana.getContentPane();
contenedor.setLayout(newBoxLayout(contenedor,BoxLayout.PAGE_AXIS));
contenedor.add(newJButton("Uno"));
contenedor.add(newJButton("Dos"));
contenedor.add(newJButton("Tres"));
contenedor.add(newJButton("Cutro"));
contenedor.add(newJButton("Cinco"));
ventana.setSize(400,400);
ventana.setVisible(true);
La alineación es propia de cada componente. Para alinear en el centro:
10. El código del ejemplo anterior:
JButtonboton=newJButton("Uno");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
contenedor.add(boton);
boton=newJButton("Dos");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
contenedor.add(boton);
boton=newJButton("Tres");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
contenedor.add(boton);
boton=newJButton("Cuatro");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
contenedor.add(boton);
boton=newJButton("Cinco");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
contenedor.add(boton);
Swingeslosuficientementeinteligente comoparacalcularel tamañoóptimode laventana,apartir
de los componentes que contiene.
Para ello, basta sustituir:
ventana.setSize(400,400);
11. Por:
ventana.pack();
Swing calcula el tamaño óptimo para que se vean todos los componentes que hemos añadido.
La ventaja es que, si fijamos nosotros el tamaño, puede que al cambiar de SO el aspecto no sea el
que nosotrosqueremos,yaque,porejemplo,el anchodel tipode letranoesel mismoentodoslos
SOs.
La idea básica en el uso de contenedores, para crear la interface gráfica de una aplicación, es que
los contenedores se pueden anidar dentro de otros contenedores.
En ejemplo anterior, los botones horizontales se han añadido a un panel -JPanel dispone de
un FlowLayout como gestor de aspecto por defecto-, y el panel a la región norte de la ventana.
JPanelpanelNorte=newJPanel();
panelNorte.add(newJButton("Norte1"));
panelNorte.add(newJButton("Norte2"));
panelNorte.add(newJButton("Norte3"));
contenedor.add(panelNorte,BorderLayout.NORTH);
12. Los botones verticalesse han añadido a un panel al que se le ha modificado su gestor de aspecto,
para que seaBoxLayout. Además, la alineación de cada uno de los botones se ha fijado como
centrada.
Finalmente, el panel se ha añadido a la región central de la ventana.
JPanelpanelCentro=newJPanel();
panelCentro.setLayout(newBoxLayout(panelCentro,BoxLayout.PAGE_AXIS));
JButtonboton=newJButton("Centro1");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
panelCentro.add(boton);
boton=newJButton("Centro2");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
panelCentro.add(boton);
boton=newJButton("Centro3");
boton.setAlignmentX(Component.CENTER_ALIGNMENT);
panelCentro.add(boton);
contenedor.add(panelCentro);
La ideabásicaespoderagrupar contenedoresdentrode otroscontenedores,de este modo,conun
poco de experiencia, siempre conseguiremos que el aspecto de las aplicaciones sea el que
deseamos.
13. Awt de java
Abstract WindowToolkit. (AWT,enespañol Kitde Herramientasde Ventana Abstracta). Conjunto
de herramientas GUI (Interfaz Gráfica con el Usuario) diseñadas para trabajar con múltiples
plataformas.Interfazde usuario,ysistemade ventanasindependientede laplataformaoriginal de
Lenguaje de programaciónJava.AWTesparte de lasJava FoundationClasses(JFC) - laAPIestándar
para suministrar una interfaz gráfica de usuario (GUI) para un programa Java.
Los componentes de AWT dependen de componentes de código nativo, por lo que a los
componentes se les suele llamar “heavyweight components” (componentes pesados).
AWTestápensadoparaaplicacionesque corranennavegadoresantiguosydefinidoconlosmínimos
de cualquieraplicación,esporestoque noincluye componentescomplejoscomopuedensertablas,
vistas de árbol, barras de progreso y otros.
Como todas las clases de Java, los componentes awt utilizados en el AWT pertenecen a una
determinada jerarquía de clases, que es muy importante conocer. Todos los componentes
desciendende laclase Component,de laque pueden yaheredaralgunosmétodosinteresantes.El
package al que pertenecen estas clases se llama java.awt y estas clases son:
Button Canvas Checkbox Choice
FileDialog
Dialog Frame
Window Panel ScrollPane
Container Label List Scrollbar
TextArea TextField
TextComponent
Component
Object
14. Características de los componentes
1. Todoslos Componentesawt (exceptoWindow ylosquederivande ella)debenserañadidos
a un Container. También un Container puede ser añadido a otro Container.
2. Para añadir un Componenta un Containerse utilizael métodoadd() de la clase Container:
containerName.add(componentName);
3. Los Containers de máximo nivel son las Windows (Frames y Dialogs). Los Panels y
ScrollPanes deben estar siempre dentro de otro Container.
4. Un ComponentsólopuedeestarenunContainer.Si estáenunContaineryse añade aotro,
deja de estar en el primero.
5. La clase Component tiene una serie de funcionalidades básicas comunes (variables y
métodos) que son heredadas por todas sus sub-clases.
Jerarquía de eventos
Todos los eventos de Java 1.1 y Java 1.2 son objetos de clasesque pertenecena una determinada
jerarquíade clases.Lasuper-claseEventObjectpertenece al packagejava.util.De EventObjectderiva
la clase AWTEvent, de la que dependen todos los eventosde AWT. Por conveniencia,estas clases
están agrupadas en el package java.awt.event.
Los eventos de Java pueden ser de alto y bajo nivel. Los eventos de alto nivel se llaman también
eventos semánticos, porque la acción de la que derivan tiene un significado en sí misma, en el
contextode lasinterfacesgráficasdeusuario.Loseventosde bajonivelsonlasaccioneselementales
que hacen posible los eventos de alto nivel. Son eventos de alto nivel los siguientes eventos: los
cuatro que tienenque vercon dar clicksobre botoneso elegircomandosenmenús(ActionEvent),
cambiar valores en barras de desplazamiento (AdjustmentEvent), elegir valores (ItemEvents) y
cambiar el texto (TextEvent).
Los eventos de bajo nivel son los que se producen con las operaciones elementales con el ratón,
teclado,containersywindows.Lasseisclasesde eventosde bajonivelsonloseventosrelacionados
15. con componentes (ComponentEvent), con los containers (ContainerEvent), con pulsar teclas
(KeyEvent),conmover,arrastrar, pulsary soltarcon el ratón (MouseEvent),conobtenero perder
el focus(FocusEvent) ycon las operacionesconventanas(WindowEvent).El modelode eventosse
complicacuando se quiere construirun tipode componente propio,noestándardel AWT. En este
caso hay que interceptarloseventosde bajonivelde Javayadecuarlosal problemaque se tratade
resolver.
16. JOptionPane
JOptionPane es una clase que nos provee una conjunto de ventanasde dialogoque es ideal, para
mostrar mensajes al usuario. Ya sean informativos, advertencias, errores, confirmaciones… O
incluso tenemos la posibilidad de solicitar la introducción de un dato.
Esta clase la encontramos dentro del paquete javax.swing. Y para que funcione, y que no nos
muestre un error el IDE, debemos importar la librería. Para ello, tenemos dos opciones:
Importar únicamente la librería especifica de JOptionPane.
Importar el conjunto de librerías que engloban a la totalidad de Swing.
Si solamente vamos a trabajar con JOptionPane, es aconsejable utilizar la que solo importa dicha
clase y no todas las librerias de Swing. Ya que de esta manera optimizamos mejor los recursos.
También, hay que destacar que es una clase estática (ya que no instanciamos nada para poder
utilizarla).
Tipos de mensaje en JOptionPane
JOptionPane tiene diferentes ventanas de dialogo, entre las que se encuentran:
JOptionPane.showMessageDialog() nos permite mostrar un mensaje.
JOptionPane.showInputDialog() nospermite laentradade datos(similaral famosoScanner
de la consola).
JOptionPane.ConfirmDialog() nospermite hacerpreguntascon varías confirmaciones.Por
ejemplo: Sí, No, Cancelar.
JOptionPane.showOptionDialog() engloba/unifica los 3 anteriores diálogos.
Método JOptionPane.showMessageDialog()
Bueno, comenzamos con el mensaje más sencillo de todos, el que menos florituras tiene.
Si escribimos JOptionPane y escribimos un . (o pulsamos CONTROL + ESPACIO), se nos abrirá en
asistente con los métodos de showMessageDialog:
JOptionPane.showMessageDialog() con 2 parámetros
Porel momento,seleccionaremosel mássencillode todos,el que solamente tienedosparámetros,
y escribiremos lo siguiente:
import javax.swing.JOptionPane;
17. public class Main {
public static void main(String[] args){
JOptionPane.showMessageDialog(null,"Javadesde0.com");
}
}
El resultado, sería el siguiente:
Elementos de un JOptionPane
Aquí podemos ver las diferentes partes de una ventana. En este caso, utilizaremos simplemente
tenemos que escojer un método y ver que parámetros necesitamos rellenar y guiarnos con la
información de más abajo.
18. ParentComponent o ventana padre: que es el primer parámetro y representa a la ventana
padre. Por el momento la pondremos a null y nos funcionará sin problema (null o
component que puede ser un JFrame).
Message o mensaje: contiene el texto a mostrar (String).
Title o título: nos permite introducir un título a la ventana (String).
Icon o icono: nos permite introduciruniconoa laventana
(EjemploJOptionPane.INFORMATION_MESSAGE).
messageType:nospermite introducirunnúmero(versegundaimagen.Escribimosunnúmero.
Por ejemplo: 0).
Tipos de iconos de un JOptionPane
Aunque losiconosse puedenhastapersonalizar,esdecir,ponerunopropio(aloque nollegaremos
en este artículo). Vamos a explicar los diferentes tipos que tenemos por defecto y las diferentes
maneras de llamarlos.
19. JOptionPane.showMessageDialog() con 4 parámetros
Bueno,unavezhemosvisto,loselementosdeJOptionPaneylosiconos.Vamosarealizarunejemplo
con el método showMessageDialog() con 4 parámetros.
import javax.swing.JOptionPane;
public class Main {
public static void main(String[] args){
JOptionPane.showMessageDialog(null, "Mensaje sin icono PLAIN_MESSAGE o -1",
"Javadesde0.com", -1);
JOptionPane.showMessageDialog(null, "Mensaje con ERROR_MESSAGE o 0",
"Javadesde0.com", 0);
JOptionPane.showMessageDialog(null, "Mensaje con INFORMATION_MESSAGE o 1",
"Javadesde0.com", 1);
JOptionPane.showMessageDialog(null, "Mensaje con WARNING_MESSAGE o 2",
"Javadesde0.com", JOptionPane.WARNING_MESSAGE);
21. Método JOptionPane.showInputDialog()
ShowInputDialog, nos permite realizar una entrada de datos de forma gráfica.
import javax.swing.JOptionPane;
public class Main {
public static void main(String[] args) {
Stringmsg = JOptionPane.showInputDialog(null,"Introduce unmensaje");
System.out.println(msg);
}
}
Guardaremos el valor introducido en el ShowInputDialog en un String, como se suele hacer con el
Scanner de la consola. Para finalmente, mostrarlo por consola. El resultado, sería el siguiente:
Método JOptionPane.ConfirmDialog()
ConfirmDialog, nos permite realizar ventanas con múltiples opciones. Una de las más famosas y
justamente laque vamosa haceren el ejemploeslaunmensaje de ¿Deseacerrarlaventana?Y en
esta ventana, nos aparecerán tres botones Yes, No y Cancel. Para capturar si se pulsa un botón,
guardamosel valoren unint y comprobamosel valorde dichavariable mediante aunIF.Si el valor
22. es0 se habrá pulsadoYes,si es1 seráNo y finalmente,si el valores2,será Cancelos.Mostraremos
los resultados por consola.
import javax.swing.JOptionPane;
public class Main {
public static void main(String[] args) {
int ventanaYesNotCancel = JOptionPane.showConfirmDialog(null, "¿Quieres
salir del programa?", "Javadesde0.com", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
//0=yes, 1=no, 2=cancel
if(ventanaYesNotCancel == 0) {
System.out.println("Has pulsado Yes");
}else if(ventanaYesNotCancel == 1){
System.out.println("Has pulsado No");
}else if(ventanaYesNotCancel == 2){
System.out.println("Has pulsado Cancel");
}
}
}
El resultado, sería el siguiente:
23. Método JOptionPane.showOptionDialog()
showOptionDialog(),comoya habíamos dichoantes de empezara hablarde los métodos,engloba
los3 métodosde arriba.Portanto,podemoshacercosassimilaresalasanteriores.Eneste ejemplo
que vamos a realizar, crearemos una ventana de dialogo que mostrará 4 botones a partir de un
array. Al pulsar cualquiera de los botones, mostrará el mensaje por la consola.
import javax.swing.JOptionPane;
public class Main {
public static void main(String[] args) {
String[] botones = {"Boton A", "Boton B", "Boton C", "Boton D"};
int ventana = JOptionPane.showOptionDialog(null,
"Pulsa un boton:",
"Javadesde0.com",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
botones, botones[0]);
if(ventana == 0) {System.out.println("Opcion A");}
else if(ventana == 1) {System.out.println("Boton B");}
else if(ventana == 2) {System.out.println("Boton C");}
else if(ventana == 3) {System.out.println("Boton D");}
}
}
El resultado, sería el siguiente:
24. Ventajas y desventajas de JOptionPane
Ventanjas de JOptionPane:
Simple.
Flexible.
Rápido.
No requiere grandes conocimientos de interfaces para su uso.
Desventajas de JOptionPane:
Se crea mediante a métodos estáticos, por eso, no hace falta instanciar nada.
No es muy potente, solamente muestra mensajes de diálogos simples. Si queremos realizar
diálogosmáscomplejos,esdonde entraríaenjuegoJframe,del que hablaremosmásadelante.
Bibliografía
Componentes AWT. (s/f). Recuperado el 15 de abril de 2021, de Buscaminegocio.com
website: http://www.buscaminegocio.com/cursos-de-java/componentes-awt.html
Cuadros de Diálogo con JOptionPane de Swing - Java desde 0. (2019, mayo 18).
Recuperado el 15 de abril de 2021, de Javadesde0.com website:
http://javadesde0.com/cuadros-de-dialogo-con-joptionpane-de-swing/
Garcia, W., & Completo, V. mi P. (s/f). AWT. Recuperado el 15 de abril de 2021, de
Blogspot.com website: https://cursointecapjava.blogspot.com/p/awt.html
Swing: Contenedores y componentes. (s/f). Recuperado el 15 de abril de 2021, de
Uji.es website:
http://www3.uji.es/~belfern/Docencia/Presentaciones/ProgramacionAvanzada/Tem
a3/swing.html