Escolar Documentos
Profissional Documentos
Cultura Documentos
Interfaces gráficas
profesionales tienen que ofrecer.
Las interfaces gráficas de usuario (GUI) ofrecen al usuario
de usuario
ventanas, cuadros de diálogo, barras de herramientas, botones,
listas desplegables y muchos otros elementos con los que ya
estamos muy acostumbrados a tratar.
Las aplicaciones son conducidas por eventos y se desarrollan
haciendo uso de las clases que para ello nos ofrece la API de Java.
La interfaz de usuario es la parte del programa que permite Cuando apareció Java, los componentes gráficos disponibles para
al usuario interaccionar con él. el desarrollo de GUI se encontraban en una biblioteca conocida
como Abstract Window Toolkit (AWT).
La API de Java proporciona una biblioteca de clases para el
desarrollo de Interfaces gráficas de usuario (en realidad son dos). AWT es adecuada para interfaces gráficas sencillas,
pero no para proyectos más complejos.
La biblioteca proporciona un conjunto de herramientas para
la construcción de interfaces gráficas que tienen Al aparecer Java 2 la biblioteca AWT se reemplazó por otra
una apariencia y se comportan de forma semejante biblioteca más robusta, versátil y flexible: Swing.
en todas las plataformas en las que se ejecuten. Aunque AWT aún sigue estando disponible, e incluso es usada
por los componentes de Swing.
La estructura básica de la biblioteca gira en torno a componentes
y contenedores. Los contenedores contienen componentes y
son componentes a su vez, de forma que los eventos pueden
tratarse tanto en contenedores como en componentes.
La API está constituida por clases, interfaces y derivaciones.
Label
Paquete de Java para la generación del GUI en aplicaciones
Canvas
reales de gran tamaño. Disponible como paquete externo
Frame en Java 1.1 e integrado desde Java 1.2.
Es una de las API de JFC (Java Foundation Classes):
List
AWT, Java 2D, Accessibility, Drag and Drop, Swing, ...
TextArea
Escrito totalmente en Java. No reemplaza a AWT.
Se apoya sobre AWT y añade JComponents.
Utiliza el modelo de eventos de Java 1.1.
Elección entre diferentes aspectos (look & feel).
Arquitectura Model-View-Controller (MVC).
Nuevos componentes (árboles, tablas, frames internos, iconos,
bordes, tooltips, beans, etcétera).
CheckBox
TextField Button
Jerarquía de clases para las GUI Jerarquía de clases para las GUI
JRadioButton
Categorías de clases: JCom ponent JEditorPane
9 Componentes intermedios: JLabel JList JCom boBox JM enuBar JPanel JO ptionPane JScrollBar JScrollPane
JPanel, JScrollPane
JTabbedPane JFileChooser
9 Componentes:
JLabel, JBbutton, JTextField, JTextArea, ... JPopupM enu JSeparator JSlider JRootPane JPane
Graphics, Color, Font, ... JInternalFram e JToolTip JLayeredPane JTableH eader JColorChooser
import javax.swing.*;
A W TEvent Container Panel Applet
M enuCom ponent M enuItem M enu public static void main(String args[]){ Método main()
Gui00 ventana = new Gui00();
M enuBar
Scrollbar }
} GUI00.java
import javax.swing.* Frame o JFrame (Swing) es una ventana que no está contenida en
otra ventana. Suele contener otros componentes.
public class MiApplet0 extends JApplet {
UI UI UI
panel
import javax.swing.*;
Para mostrar una ventana en una posición concreta disponemos import java.awt.*;
del método setLocation(x, y) de la clase JFrame.
public class Gui01 extends JFrame {
Cuando se crea un objeto JFrame, se crea un objeto Container
Container panel;
(AWT). El objeto JFrame usa el panel de contenido (Container) JButton miboton;
para albergar los componentes del frame.
public Gui01() {
super("Ejemplo 01 con botón");
// Configurar componentes ;
1. Obtenemos el panel de contenido del frame:
miboton = new JButton("Aceptar");
Container panel = this.getContentPane(); panel = this.getContentPane();
panel.add(miboton);
setSize(200,100);
setVisible(true);
2. Añadimos componentes a dicho panel: setDefaultCloseOperation(EXIT_ON_CLOSE);
}
panel.add(unComponente);
public static void main(String args[]) {
Gui01 ventana = new Gui01();
} Gui01.java
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 8 – Interfaces gráficas de usuario - 14 Curso de Java Tema 8 – Interfaces gráficas de usuario - 15
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Administradores de disposición Administradores de disposición
Los componentes se agregan al contenedor con el método add(). Para organizar el contenedor se utiliza el método setLayout():
JButton unBoton = new JButton("Texto del botón"); public void setLayout(LayoutManager mgr)
panel.add(unBoton);
El efecto de add() depende del esquema de colocación o
disposición (layout) del contenedor que se use. Crea una disposición para Tipo de disposición
el contenedor actual (BorderLayout, ...)
Existen diversos esquemas de disposición: FlowLayout,
BorderLayout, GridLayout, ...
setLayout(new BorderLayout());
Los objetos contenedores se apoyan en objetos LayoutManager
(administradores de disposición). setLayout(new FlowLayout());
Clases más usadas que implementa la interfaz LayoutManager:
setLayout(new GridLayout(3,4));
FlowLayout: un componente tras otro de izquierda a derecha.
BorderLayout: 5 regiones en el contenedor (North, South, ...). El layout manager elige la mejor posición y tamaño de cada
GridLayout: contenedor en filas y columnas. componente de acuerdo al espacio disponible.
import javax.swing.*; Los paneles actúan como pequeños contenedores para agrupar
import java.awt.*; componentes. Colocamos los componentes en paneles y
los paneles en el frame o incluso en otros paneles.
public class Gui03b extends JFrame {
Container panel;
public Gui03b() {
super("Ejemplo de Layout");
// Configurar componentes: fram e
panel = this.getContentPane(); textfield
// GridLayout p2
panel.setLayout(new GridLayout(4, 3, 5, 5)); boton 12
// Add buttons to the frame botones p1
for(int i = 1; i <= 10; i++)
panel.add(new JButton(Integer.toString(i)));
setSize(200,200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
... Gui03b.java
// Extraído de "Introduction to Java Programming" // Create panel p2 to hold a text field and p1
// de Y. Daniel Lang (Prentice Hall, 2001) JPanel p2 = new JPanel();
fram e
p2.setLayout(new BorderLayout());
import java.awt.*; textfield p2.add(new JTextField("Aquí el tiempo"),
p2
import javax.swing.*; boton 12
BorderLayout.NORTH);
botones p1 p2.add(p1, BorderLayout.CENTER);
public class Gui04 extends JFrame { // Add p2 and a button to the frame
public Gui04() { container.add(p2, BorderLayout.EAST);
container.add(new Button("Aquí la comida"),
Container container = getContentPane();
BorderLayout.CENTER);
container.setLayout(new BorderLayout());
}
// Create panel p1 for the buttons and set GridLayout
JPanel p1 = new JPanel(); /** Main method */
p1.setLayout(new GridLayout(4, 3)); public static void main(String[] args) {
// Add buttons to the panel Gui04 frame = new Gui04();
for(int i = 1; i <= 9; i++) { frame.setTitle("Horno microondas");
p1.add(new JButton("" + i)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} frame.setSize(400, 250);
p1.add(new JButton("" + 0)); frame.setVisible(true);
p1.add(new JButton("Start")); }
p1.add(new JButton("Stop")); ... } Gui04.java
import javax.swing.*;
JPanel se puede usar para dibujar.
import java.awt.*;
Para dibujar en un panel se crea una clase derivada de JPanel
y se redefine el método paintComponent() que le indica al panel class MiPanel extends JPanel {
public void paintComponent(Graphics g) {
como dibujar.
super.paintComponent(g);
La clase Graphics es una clase abstracta para todos g.drawString("Interfaz gráfica", 40, 40);
los contextos gráficos. }
} Método a redefinir
Una vez obtenido el contexto gráfico podemos llamar desde este
objeto a las funciones gráficas definidas en la clase Graphics. public class Gui05 extends JFrame {
Container panel;
Graphics contiene información acerca de la zona que necesita public Gui05() {
ser redibujada: el objeto donde dibujar, un origen de traslación, super("Ejemplo de dibujo");
el color actual, la fuente actual, etcétera. panel = this.getContentPane();
panel.add(new MiPanel());
setSize(200, 100);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
...
Gui05.java
import javax.swing.*;
Cuando utilizamos el método paintComponent() para dibujar import java.awt.*;
en un contexto gráfico g, ese contexto es un ejemplar de
una subclase concreta de la clase Graphics para la plataforma class MiPanel extends JPanel {
específica. public void paintComponent(Graphics g) {
Color c = new Color(180, 10, 120); Creación de un color RGB
El método paintComponent() es llamado la primera vez y g.setColor(c);
g.drawString("Dibujar en el panel", 90, 90);
cada vez que es necesario redibujar el componente. g.fillOval(1, 1, 90, 90);
Al hacer super.paintComponent(g) nos aseguramos de que }
}
el área visualizada se limpia antes de volver a dibujar.
class MiPanel extends JPanel { public class Gui06 extends JFrame {
Container panel;
public void paintComponent(Graphics g) { public Gui06(){
super.paintComponent(g); super("Ejemplo de dibujo");
g.drawString("Interfaz gráfica", 40, 40); panel = this.getContentPane();
} panel.add(new MiPanel());
setSize(300, 200);
} setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} Gui06.java
...
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 8 – Interfaces gráficas de usuario - 28 Curso de Java Tema 8 – Interfaces gráficas de usuario - 29
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Graphics g;
Las fuentes de letras se representan con objetos de la clase
... java.awt.Font que tiene un sólo constructor:
g.setColor(Color.blue);
g.setBackground(Color.red); Font(String nombre, int estilo, int tamaño)
g.drawLine(int x1, int y1, int x2, int y2); En este constructor todos los parámetros tienen un conjunto
g.drawRect(int x, int y, int ancho, int alto); limitado de posiblidades.
g.drawRoundedRect(int x, int y, int ancho, int alto,
int arcWidth, int arcHeight); Nombre Estilo
g.fillRect(int x, int y, int ancho, int alto); "Helvetica" Font.PLAIN
g.fillRoundedRect(int x, int y, int ancho, int alto, "TimesNewRoman" Font.BOLD
int arcWidth, int arcHeight); "Courier" Font.ITALIC
g.drawOval(int x, int y, int ancho, int alto); "Dialog" Font.BOLD + Font.ITALIC
g.fillOval(int x, int y, int ancho, int alto); "DialogInput"
g.drawArc(int x, int y, int ancho, int alto, int ang1, "ZapfDingbats"
int ang2);
g.drwaString(String cadena, int x, int y);
g.setFont(Font f);
...
import javax.swing.*;
import java.awt.*; Al interactuar con la aplicación, el usuario:
class MiPanel extends JPanel { 9 Acciona componentes (ActionEvent).
public void paintComponent(Graphics g) {
g.setFont(new Font("Helvetica", Font.PLAIN, 18)); El usuario pulsa un botón.
g.drawString("Hola", 70, 50);
g.setFont(new Font("TimesRoman", Font.BOLD, 18)); El usuario termina de introducir un texto en un campo y
g.drawString("Hola", 70, 80); presiona Intro.
g.setFont(new Font("DialogInput", Font.ITALIC, 18));
g.drawString("Hola", 70, 110); El usuario selecciona un elemento de una lista pulsando el
} preferido (o de un menú).
}
public class Gui07 extends JFrame { Pulsa o suelta botones del ratón (MouseEvent).
Container panel;
public Gui07() {
9 Minimiza, cierra o manipula una ventana (WindowEvent).
super("Ejemplo de dibujo"); 9 Escribe con el teclado (KeyEvent).
panel = this.getContentPane();
panel.add(new MiPanel()); 9 Descubre porciones de ventanas (PaintEvent).
setSize(200, 200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} ... Gui07.java
Cuando el usuario de un programa o applet mueve el ratón, Acción Objeto origen Tipo de evento
presiona un pulsador o pulsa una tecla, genera un evento Pulsar un botón JButton ActionEvent
(actionEvent). Cambio del texto JTextComponent TextEvent
Pulsar Intro en un campo de texto JTextField ActionEvent
Los eventos son objetos de ciertas clases. Normalmente
un objeto de alguna subclase de EventObject que indica: Selección de un nuevo elemento JCombobox ItemEvent
ActionEvent
9 El elemento que accionó el usuario. Selección de elemento(s) JList ListSelection-
Event
9 La identificación del evento que indica la naturaleza
Pulsar una casilla de verificación JCheckBox ItemEvent
del evento.
ActionEvent
9 La posición del ratón en el momento de la interacción. Pulsar un botón de radio JRadioButton ItemEvent
ActionEvent
9 Teclas adicionales pulsadas por el usuario, como la tecla
Selección de una opción de menú JMenuItem ActionEvent
Control, la tecla de Cambio a mayúsculas, etcétera.
Mover la barra de desplazamiento JScrollBar AdjustmentEvent
Abrir, cerrar, minimizar,
maximizar o cerrar la ventana JWindow WindowEvent
...
Al pulsar el botón Copiar, se debe copiar el valor del cuadro "valor" class MiGui extends JFrame implements ActionListener {
en el cuadro "Copia". ...
public void MiGui(){
// Registro los componentes interesados
// en responder a eventos ...
componente.addActionListener(this);
Origen del evento:
}
Botón Copiar
...
public actionPerformed(ActionEvent e) {
Objeto evento: ... // Aquí se responde el evento
ActionEvent e }
}
Objeto oyente:
Este método añade el oyente especificado (frame) a la lista
La ventana
de oyentes para recibir eventos de acción (ActionEvent)
desde este componente.
1. En el constructor del frame (oyente), registro el botón y Creamos un manejador de eventos en dos pasos:
añado el oyente (frame) para recibir eventos de acción Definimos una clase específica que haga de oyente de eventos y
desde el botón. que implemente el método actionPerformed().
botonCopiar.addActionListener(this); class MiOyente implements ActionListener {
La ventana (oyente) public void actionPerformed() {
código ...
2. El usuario pulsa el botón.
3. El botón crea el objeto ActionEvent. Registramos un ejemplar como oyente de componentes:
4. El botón envía el mensaje actionPerformed() al frame, componente.addActionListener(ejemplar_de_MiOyente);
con el argumento ActionEvent.
Cada vez que el componente produzca el evento, se invocará
automáticamente el método actionPerformed().
El código de este método se ejecutará cada vez que se pulse
el botón.
Otro modelo para responder a eventos Ejemplo: botón con pitido (modelo 1)
setSize(400, 100);
Una aplicación que muestre el número de pulsaciones que se
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE); realizan sobre su botón.
} public class Gui11 extends JFrame {
...
public static void main(String args[]) { public Gui11() {
Gui10 ventana = new Gui10(); boton1 = new JButton("PULSA");
} label1 = new JLabel("Pulsaciones: 0");
panel = getContentPane();
class OyenteBoton implements ActionListener { panel.add(boton1);
public void actionPerformed(ActionEvent e){ panel.add(label1);
String valor = campoValor.getText(); panel.setLayout(new FlowLayout());
resultado.setText(valor); boton1.addActionListener(new OyenteBotonPulsaciones());
} ...
} }
} ...
class OyenteBotonPulsaciones implements ActionListener {
public void actionPerformed(ActionEvent e){
contador++;
Gui10.java label1.setText("Pulsaciones: " + contador); Gui11.java
} ...
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 8 – Interfaces gráficas de usuario - 46 Curso de Java Tema 8 – Interfaces gráficas de usuario - 47
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Ejemplo: cambio de color Ejemplo: cambio de color
import javax.swing.*;
public static void main(String args[]) {
import java.awt.*;
Gui12 ventana = new Gui12();
import java.awt.event.*;
}
public class Gui12 extends JFrame {
class ColorActionListener implements ActionListener {
JButton red = new JButton("Rojo");
Color fondo;
JButton blue = new JButton("Azul");
public ColorActionListener(Color unColor) {
Container panel;
fondo = unColor;
}
public Gui12() {
public void actionPerformed(ActionEvent evento) {
super("Color de fondo");
panel.setBackground(fondo);
panel = getContentPane();
}
panel.setLayout(new FlowLayout());
}
panel.add(red);
}
panel.add(blue);
red.addActionListener(new ColorActionListener(Color.red));
blue.addActionListener(new ColorActionListener(Color.blue));
setSize(200, 200);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
... Gui12.java
ActionEvent ActionEvent
El objeto ActionEvent ofrece un método getActionCommand() El método getSource() indica el objeto en el que se ha
que devuelve un objeto con la información sobre el origen originado el evento:
del evento (el botón en nuestro caso).
Con un botón, devuelve la etiqueta del botón. public void actionPerformed(ActionEvent e) {
if(e.getSource() == lista) {
Para identificar botones individuales: campo1.setText("En la lista.");
}
else if(e.getSource() == texto) {
public void actionPerformed(ActionEvent e) { campo2.setText("En el campo de texto.");
String s = (String)e.getActionCommand(); }
if(s.equals("Aceptar")) { else if(e.getSource() == boton) {
// Tratamiento del botón Aceptar campo3.setText("En el botón.");
}
}
... }
Para facilitar la tarea del programador se han creado una serie de Constructores:
interfaces que deben implementarse cuando se quieren procesar
algunos de estos eventos. Algunas interfaces y sus métodos son: JButton(String text)
JButton(String text, Icon icon)
JButton(Icon icon)
ActionListener actionPerformed(ActionEvent)
Escucha eventos de tipo ActionEvent Respuesta a botones:
boton1 = new JButton("A Euros "); Para texto, una imagen o ambos:
boton1.setIcon(new ImageIcon("flag1.gif")); JLabel(String text,
int horizontalAlignment)
JLabel(String text)
JLabel(Icon icon)
boton2 = new JButton(new ImageIcon("flag2.gif")); JLabel(Icon icon,
int horizontalAlignment)
Campos de texto para introducir caracteres: Listas de elementos para seleccionar un solo valor:
JTextField(int columns) Creación: JComboBox ch1 = new JComboBox();
JTextField(String text) Agregar opciones: ch1.addItem(Object elemento);
JTextField(String text, int columns) Registrar Evento: ch1.addItemListener( objeto);
JTextField text1 = new JTextField("hola", 10); Obtener selección: val = ch1.getSelectedIndex();
ch1.getItem()
Poner texto: text1.setText("Adios"); Implementar la interfaz ItemListener
Obtener texto: String str = text1.getText(); Implementar el método itemStateChanged(ItemEvent e)
Agregar al Panel: p1.add(text1); ch1.addItemListener(new OyenteItem());
. . .
class OyenteItem implements ItemListener {
public void itemStateChanged(ItemEvent e) {
...
}}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 8 – Interfaces gráficas de usuario - 58 Curso de Java Tema 8 – Interfaces gráficas de usuario - 59
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Componentes (JavaBeans): JList Componentes (JavaBeans): JList
Listas de elementos para seleccionar uno o varios valores: Implementar la interfaz ListSelectionListenner
Graphics (java.awt)
Contenedores de alto nivel:
Component (funcionalidad básica de componentes gráficos)
Button, Canvas, CheckBox, Choice, Label, List, ScrollBar JFrame
TextComponent Habitualmente la clase JFrame se emplea para crear
TextField, TextArea la ventana principal de una aplicación en Swing.
Container (permite agrupar, añadir y eliminar componentes)
JDialog
(también definir diseño o disposición (layout managers))
Ventanas de interacción con el usuario.
ScrollPane
Panel
Applet (java.applet)
JApplet (javax.swing)
Contenedores intermedios:
Window JPanel
Frame Agrupa a otros componentes.
JFrame (javax.swing)
Dialog JScrollPanel
FileDialog Incluye barras de desplazamiento.
JDialog (javax.swing)
JWindow (javax.swing)
JComponent (javax.swing)
public class Gui18 extends JFrame { public class Gui19 extends JFrame {
Container p; Container p;
public Gui18() { public Gui19() {
super("Título de la ventana"); super("Título de la ventana");
p = getContentPane(); p = getContentPane();
p.setLayout(new FlowLayout()); p.setLayout(new FlowLayout());
setSize(200, 100); // pack(); setSize(200, 100);
setVisible(true); // show(); setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE);
// if ocurre algo Object[] textoOpciones = {"Si adelante", "Ahora no", "No
JOptionPane.showMessageDialog(null, sé"};
"Debe introducir datos en todos los campos", int opcion = JOptionPane.showOptionDialog(null,
"Error de entrada ", "¿Desea continuar?", "mensaje",
JOptionPane.ERROR_MESSAGE); JOptionPane.YES_NO_CANCEL_OPTION,
} JOptionPane.QUESTION_MESSAGE, null, textoOpciones,
public static void main(String[] args) { textoOpciones[0]);
Gui18 f = new Gui18(); }
}
} Gui18.java ... Gui19.java
Menús Menús
Java ofrece varias clases para poner menús en una ventana: Una ventana (frame) sólo puede tener una barra de menús
(objeto MenuBar), que se sitúa en la parte de arriba del mismo.
JMenuBar
JMenu
JMenuItem Los submenús son botones JMenu.
JCheckBoxMenuItem
JRadioButtonMenuItem
Un JFrame o JApplet puede guardar un barra de menú donde Los elementos de los menús son botones JMenuItem.
se cuelgan menús desplegables.
Los menús tienen elementos de menú que puede seleccionar Cuando se activa un menú se despliegan automáticamente
el usuario. las opciones del menú.
Las barras de menús se pueden contemplar como una estructura
que soporta menús.
JMenuBar barraMenu = new JMenuBar(); // Establecemos oyentes para las opciones elegibles:
setJMenuBar(barraMenu); // La barra de menús de este frame listar.addActionListener(new OyenteMenu());
// El menú: opcionSubmenu.addActionListener(new OyenteMenu());
JMenu menuOpciones = new JMenu("Menú de opciones"); ...
barraMenu.add(menuOpciones); // Añadimos el menú a la barra
// Un elemento de menú:
JMenuItem listar = new JMenuItem("Listar los alumnos"); class OyenteMenu implements ActionListener {
menuOpciones.add(listar); // Añadimos el elemento al menú public void actionPerformed(ActionEvent e) {
// Inserción de una línea separadora en el menú: String actionCommand = e.getActionCommand();
menuOpciones.add(new JSeparator()); if(e.getSource() instanceof JMenuItem) {
// Un menú que será un submenú del anterior: if("Listar los alumnos".equals(actionCommand)) {
JMenu subMenu = new JMenu("Submenú"); texto.setText("Listar los alumnos");
// Un elemento de menú para el submenú: }
JMenuItem opcionSubmenu = new JMenuItem("Opción de submenú"); if("Opción de submenú".equals(actionCommand)) {
subMenu.add(opcionSubmenu); // La añadimos al submenú texto.setText("Opción de submenú");
// Añadimos el submenú como elemento del menú: }
menuOpciones.add(subMenu); }
}
}
Gui21.java
import java.awt.*;
Aplicación que permite realizar operaciones aritméticas. import java.awt.event.*;
La interfaz contiene etiquetas y campos de texto para los import javax.swing.*;
operandos y el resultado. La operación se selecciona en el menú:
public class Gui22 extends JFrame {
Container panel;
JTextField jtfNum1, jtfNum2, jtfResult;
JMenuItem jmiSuma, jmiResta, jmiMul, jmiDiv, jmiCerrar;
public Gui22() {
super("Menús");
JMenuBar jmb = new JMenuBar();
setJMenuBar(jmb);
JMenu operationMenu = new JMenu("Operación");
operationMenu.setMnemonic('O'); // Letra distinguida
jmb.add(operationMenu);
operationMenu.add(jmiSuma = new JMenuItem("Suma", 'S'));
operationMenu.add(jmiResta = new JMenuItem("Resta", 'R'));
operationMenu.add(jmiMul = new JMenuItem("Multiplica",'M'));
operationMenu.add(jmiDiv = new JMenuItem("Divide", 'D'));
...
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 8 – Interfaces gráficas de usuario - 80 Curso de Java Tema 8 – Interfaces gráficas de usuario - 81
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
class OyenteMenu implements ActionListener { La arquitectura MVC es una arquitectura típica de diseño de GUI.
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand(); 9 El modelo representa la estructura lógica de la GUI,
if(e.getSource() instanceof JMenuItem) { independientemente de su representación visual.
if("Suma".equals(actionCommand)) calculate('+');
else if("Resta".equals(actionCommand)) calculate('-'); 9 La vista constituye la representación visual de la GUI.
else 9 El controlador constituye la lógica de interacción con el usuario.
if("Multiplica".equals(actionCommand)) calculate('*');
else if("Divide".equals(actionCommand)) calculate('/'); Un primer paso hacia esta arquitectura consiste en la separación
else if("Cerrar".equals(actionCommand)) System.exit(0); entre la aplicación y la interfaz o vista:
}
} public static void main(String args[]) {
} Aplicación aplicación = new Aplicación();
} GUI gui = new GUI(aplicación); }
Aunque el mejor modelo separa en las tres partes:
public static void main(String args[]) {
Modelo modelo = new Modelo();
Controlador controlador = new Controlador(modelo);
Gui22.java GUI gui = new GUI(controlador); }