Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nivel 5
Construyendo la Interfaz Grfica
Motivacin
Interfaz usuario
Usuario
Motivacin
Interfaz usuario
Usuario
A travs de la interfaz:
Aspectos importantes
Arquitectura
Estructura clara Fcil de mantener
Cmo construir las clases que implementan una interfaz usuario Cmo integrar las clases de la interfaz con las clases del mundo
El Calculador de Impuestos
Funcionalidad Interfaz usuario Requerimientos Funcionales Arquitectura
Mundo Interfaz
Clculo de impuestos como porcentaje del precio del vehculo (% determinado por un rango) Hay tres tipos de descuento
Pronto pago, servicio pblico, traslado de cuenta
Tarea No. 1
RF1: Buscar el avalo de un vehculo
Resumen:
Dada la informacin del vehculo, presentar el valor de avalo del mismo
Entradas:
Resultado:
Tarea No. 1
RF2:Calcular el pago de impuesto de un vehculo
Resumen:
Dada la informacin de un vehculo, y el conjunto de descuentos que le aplican, dar el valor a pagar por los impuestos del vehculo
Entradas:
Resultado:
Mundo
Interfaz
Tarea No. 2
CalculadorImpuestos
Constantes Asociaciones
Marca
Atributos Asociaciones
Linea
Atributos Asociaciones
Modelo
Atributos
RangoImpuesto
Atributos
Clases JAVA
Entidades
Mundo del Problema
Estudiante Tienda Banco Recurso Avion
Panel
Zona de texto
Caja de chequeo
Etiqueta
Boton
principal
principal
Clases JAVA
Se encuentran en una biblioteca grfica (swing) Paquete: java.swing Deber ser importado
La Ventana Principal
La Ventana Principal
Contiene TODOS los elementos de visualizacin e interaccin (con los que el usuario va a utilizar el programa) UNICA FUNCION:
Servir como marco para los dems elementos de la interfaz (AGRUPA)
Es un contenedor grfico
La Ventana Principal
Ttulo Controles para cerrar el programa
La Ventana Principal
principal
principal
Clase InterfazImpuestosCarro
Como cualquier clase:
Est declarada en su propio archivo: InterfazImpuestosCarro.java (pag. 8) Sigue las mismas reglas que cualquier clase del mundo
Diferencia:
Est declarada en otro paquete: uniandes.cupi2.impuestosCarro.interfaz (ver en Eclipse)
Clase InterfazImpuestosCarro
package uniandes.cupi2.impuestosCarro.interfaz; import java.awt.*; import javax.swing.*; import uniandes.cupi2.impuestosCarro.mundo.*; /** * Interfaz de clculo de impuestos de carros */ public class InterfazImpuestosCarro extends JFrame { }
Clase InterfazImpuestosCarro
package uniandes.cupi2.impuestosCarro.interfaz;
Clase InterfazImpuestosCarro
package uniandes.cupi2.impuestosCarro.interfaz; import java.awt.*; import javax.swing.*;
Clase InterfazImpuestosCarro
package uniandes.cupi2.impuestosCarro.interfaz; import java.awt.*; import javax.swing.*; import uniandes.cupi2.impuestosCarro.mundo.*;
Clase InterfazImpuestosCarro
principal
principal
Clase InterfazImpuestosCarro
package uniandes.cupi2.impuestosCarro.interfaz; import java.awt.*; import javax.swing.*; import uniandes.cupi2.impuestosCarro.mundo.*; /** * Interfaz de clculo de impuestos de carros */ public class InterfazImpuestosCarro extends JFrame { }
La clase se declara con la misma sintxis de las clases del modelo del mundo
Clase InterfazImpuestosCarro
package uniandes.cupi2.impuestosCarro.interfaz; import java.awt.*; import javax.swing.*; import uniandes.cupi2.impuestosCarro.mundo.*; /** * Interfaz de clculo de impuestos de carros */ public class InterfazImpuestosCarro extends JFrame { }
Se agrega extends JFrame para indicar que es una ventana
Clase InterfazImpuestosCarro
Clase de swing que se est extendiendo
principal
principal
Clase InterfazImpuestosCarro
Cmo cambiar el estado (apariencia) de la ventana?
Clase InterfazImpuestosCarro
Cmo cambiar el estado (apariencia) de la ventana? R// Con los mtodos de la clase JFrame
Cambiar el ttulo de la ventana Cambiar el tamao de la ventana Agregar componentes grficos
Mtodos de JFrame
setSize ( ancho, alto ) setResizable ( true/false ) setTitle ( titulo ) setDefaultCloseOperation ( EXIT_ON_CLOSE) setVisible ( true/false ) add ( componente )
Divisiones y Paneles
Un Panel
Se encarga de agrupar elementos grficos por contenido y uso Facilita al usuario su localizacin y su uso Cada panel se implementa como una clase aparte en el modelo
PanelVehiculo PanelDescuentos PanelResultados
principal
principal
Clase InterfazImpuestosCarro
Concepto nuevo
NORTH
CENTER
EAST
SOUTH
1 2 3 4 5 6 7 8 9 10 11 12
JFrame
JFrame
JPanel
PanelVehiculo
public class PanelVehiculo extends JPanel { public PanelVehiculo( ) { setLayout( new GridLayout( 5, 2 ) ); setPreferredSize( new Dimension( 0, 130 ) );
PanelVehiculo
public class PanelVehiculo extends JPanel { public PanelVehiculo( ) { setLayout( new GridLayout( 5, 2 ) ); setPreferredSize( new Dimension( 0, 130 ) );
Definir la altura del panel. No se define el ancho porque va a ser igual al de la ventana
130
PanelVehiculo
public class PanelVehiculo extends JPanel { public PanelVehiculo( ) { setLayout( new GridLayout( 5, 2 ) ); setPreferredSize( new Dimension( 0, 130 ) ); TitledBorder border = BorderFactory.createTitleBorder (Datos del vehculo); border.SetTitleColor( Color.BLUE ); setBorder( border );
Se crea y se asocia un borde al panel para facilitar la identificacin de las divisiones dentro de la ventana
PanelDescuentos
public class PanelDescuentos extends JPanel { public PanelVehiculo( ) { setLayout( new GridLayout( 2, 2 ) );
PanelDescuentos
public class PanelDescuentos extends JPanel { public PanelVehiculo( ) { setLayout( new GridLayout( 2, 2 ) ); TitledBorder border = BorderFactory.createTitleBorder (Descuentos); border.SetTitleColor( Color.BLUE ); setBorder( border );
Etiquetas
Permiten agregar un texto corto en la interfaz Son objetos de la clase JLabel de Java Algunos mtodos de la clase JLabel:
setText (texto); setForeground ( color );
Cualquier constante de la clase Color de Java (BLACK, GREEN, RED, BLUE, ) o un nuevo color creado con 3 ndices RGB
Zonas de texto
Cumplen dos funciones:
Permiten el ingreso de informacin por parte del usuario (ENTRADAS de los requerimientos funcionales) Permiten mostrar las respuestas calculadas por el programa
Zonas de texto
Cumplen dos funciones:
Permiten el ingreso de informacin por parte del usuario (ENTRADAS de los requerimientos funcionales) Permiten mostrar las respuestas calculadas por el programa
Zonas de texto
Cumplen dos funciones:
Permiten el ingreso de informacin por parte del usuario (ENTRADAS de los requerimientos funcionales) Permiten mostrar las respuestas calculadas por el programa
Zonas de texto
Cumplen dos funciones:
Permiten el ingreso de informacin por parte del usuario (ENTRADAS de los requerimientos funcionales) Permiten mostrar las respuestas calculadas por el programa
Ejemplo en PanelVehiculo
public class PanelVehiculo extends JPanel { private JLabel labMarca; private JLabel labLinea; private JLabel labModelo; Declarar private JLabel labValor; private JTextField txtMarca; private JTextField txtLinea; private JTextField txtModelo; private JTextField txtValor; }
Ejemplo en PanelVehiculo
public PanelVehiculo ( ) { labMarca = new JLabel ( Marca ); labLinea = new JLabel ( Lnea ); labModelo = new JLabel ( Modelo ); labValor = new JLabel ( Valor ); txtMarca = new JTextField( ); txtLinea = new JTextField( ); txtModelo = new JTextField( ); txtValor = new JTextField( $ 0 ); }
Crear las etiquetas y las zonas de texto (new) en el mtodo constructor del panel
Ejemplo en PanelVehiculo
public PanelVehiculo ( ) { labMarca = new JLabel ( Marca ); labLinea = new JLabel ( Lnea ); labModelo = new JLabel ( Modelo ); labValor = new JLabel ( Valor ); txtMarca = new JTextField( ); txtLinea = new JTextField( ); txtModelo = new JTextField( ); txtValor = new JTextField( $ 0 ); txtValor.SetEditable(false); txtValor.SetForeground(Color.BLUE); txtValor.SetBackground(Color.WHITE); }
Configurar las caractersticas de las etiquetas o de las zonas de texto con los mtodos de las clases JLabel o JTextField
Ejemplo en PanelVehiculo
public PanelVehiculo ( ) { labMarca = new JLabel ( Marca ); labLinea = new JLabel ( Lnea ); labModelo = new JLabel ( Modelo ); labValor = new JLabel ( Valor ); txtMarca = new JTextField( ); txtLinea = new JTextField( ); txtModelo = new JTextField( ); txtValor = new JTextField( $ 0 ); txtValor.SetEditable(false); txtValor.SetForeground(Color.BLUE); txtValor.SetBackground(Color.WHITE); add( labMarca ); add( txtMarca ); add( labLinea ); add( txtLinea ); add( labModelo ); add( txtModelo ); add( labValor ); add( txtValor );
Cajas de chequeo
Permiten al usuario seleccionar o deseleccionar una opcin. Son objetos de la clase JCheckBox de Java Algunos mtodos de la clase JCheckBox:
isSelected ( );
Indica (true/false) si el usuario seleccion la opcin
Cajas de chequeo
Permiten al usuario seleccionar o deseleccionar una opcin. Son objetos de la clase JCheckBox de Java Algunos mtodos de la clase JCheckBox:
isSelected ( );
Marca como seleccionado o no, la caja de chequeo
setSelected ( true/false );
Ejemplo en PanelDescuentos
public class PanelDescuentos extends JPanel { private JCheckBox cbPago; Declarar private JCheckBox cbSPublico; atributos private JCheckBox cbTCuenta; }
Ejemplo en PanelDescuentos
public PanelDescuentos ( ) { cbPago = new JCheckBox ( Pronto pago ); cbSPublico = new JCheckBox ( Servicio pblico ); cbTCuenta = new JCheckBox ( Traslado de cuenta ); }
Ejemplo en PanelDescuentos
public PanelDescuentos ( ) { cbPago = new JCheckBox ( Pronto pago ); cbSPublico = new JCheckBox ( Servicio pblico ); cbTCuenta = new JCheckBox ( Traslado de cuenta ); add( cbPago ); add( cbTCuenta ); add( cbSPublico );
Botones
Permiten al usuario expresar sus rdenes al programa (es el mecanismo ms simple de interaccin). Son objetos de la clase JButton de Java La clase JButton tiene DOS METODOS especiales:
setActionCommand ( evento ); addActionListener ( panel );
Ejemplo en PanelResultados
public class PanelResultados extends JPanel { private JLabel labTotal; private JTextField txtTotal; private JButton butLimpiar; private JButton butCalcular; }
Ejemplo en PanelResultados
public PanelResultados ( ) { labTotal = new JLabel ( Total a pagar ); txtTotal = new JTextField ( $ 0 ); butLimpiar = new JButton ( Limpiar ); butCalcular = new JButton ( Calcular ); }
Ejemplo en PanelResultados
public PanelResultados ( ) { labTotal = new JLabel ( Total a pagar ); txtTotal = new JTextField ( $ 0 ); butLimpiar = new JButton ( Limpiar ); butCalcular = new JButton ( Calcular ); txtTotal.SetEditable( false ); txtTotal.SetForeground( Color.BLUE ); txtTotal.SetBackground( Color.WHITE ); add( new Jlabel( ) ); add( new Jlabel( ) ); add(butLimpiar); add(labTotal); add(txtTotal); add(butCalcular);
Acciones y Eventos
evento llamada a un mtodo Interfaz usuario
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Dar un nombre al evento y asociarlo a un botn
public class PanelResultados extends JPanel { public final static String LIMPIAR = limpiar; public final static String CALCULAR = calcular; public PanelResultados( ) { butLimpiar.SetActionCommand ( LIMPIAR ); butCalcular.SetActionCommand ( CALCULAR ); } }
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Dar un nombre al evento y asociarlo a un botn
public class PanelResultados extends JPanel { public final static String LIMPIAR = limpiar; public final static String CALCULAR = calcular; public PanelResultados( ) { butLimpiar.SetActionCommand ( LIMPIAR ); butCalcular.SetActionCommand ( CALCULAR ); } }
En el mtodo constructor del panel Se asocian los nombres de los eventos con cada botn
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Atender el evento
public class PanelResultados extends JPanel implements ActionListener { public void actionPerformed (ActionEvent evento ) { Agregar una declaracin String comando = evento.getActionCommand( ); en el encabezado de la if ( (comando.equals( LIMPIAR) ) clase del panel que { contiene el botn (para // Reaccin al evento de LIMPIAR que pueda percibir las } acciones del usuario) else if (comando.equals( CALCULAR ) ) // Reaccin al evento de CALCULAR } }
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Atender el evento
public class PanelResultados extends JPanel implements ActionListener { Implementar en la clase del panel que contiene el public void actionPerformed (ActionEvent evento ) botn, el mtodo especial { actionPerformed String comando = evento.getActionCommand( ); if ( (comando.equals( LIMPIAR) ) { // Reaccin al evento de LIMPIAR parmetro del mtodo: } evento ocurrido en el else if (comando.equals( CALCULAR ) ) panel { // Reaccin al evento de CALCULAR } }
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Atender el evento
public class PanelResultados extends JPanel implements ActionListener { Implementar en la clase del panel que contiene el public void actionPerformed (ActionEvent evento ) botn, el mtodo especial { actionPerformed String comando = evento.getActionCommand( ); if ( (comando.equals( LIMPIAR) ) { // Reaccin al evento de LIMPIAR parmetro del mtodo: } evento ocurrido en el else if (comando.equals( CALCULAR ) ) panel { // Reaccin al evento de CALCULAR } }
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Atender el evento
public class PanelResultados extends JPanel implements ActionListener { public void actionPerformed (ActionEvent evento ) { String comando = evento.getActionCommand( ); if ( (comando.equals( LIMPIAR) ) { // Reaccin al evento de LIMPIAR Mtodos de la ventana } principal !!! else if (comando.equals( CALCULAR ) ) { // Reaccin al evento de CALCULAR } }
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Atender el evento
public class PanelResultados extends JPanel implements ActionListener { public void actionPerformed (ActionEvent evento ) { Cada vez que el String comando = evento.getActionCommand( ); usuario hace click if ( (comando.equals( LIMPIAR) ) en un botn del { panel, se ejecuta el // Reaccin al evento de LIMPIAR mtodo } actionPerformed else if (comando.equals( CALCULAR ) ) { // Reaccin al evento de CALCULAR } }
Cmo manejar un evento con un botn de la interfaz en 3 pasos y no morir en el intento: Decir que el panel es el encargado de atender el evento
public class PanelResultados extends JPanel implements ActionListener { Mediante el mtodo public PanelResultados ( ) addActionListener de la { clase JButton butLimpiar.addActionListener (this); butCalcular.addActionListener (this); } }
parmetro del mtodo: el objeto que lo est ejecutando, es decir el panel mismo
Qu vamos a aprender
Coordinar los elementos de la interfaz y del modelo del mundo para satisfacer los requerimientos funcionales Estructurar y repartir las responsabilidades Una propuesta de arquitectura:
Facilita la localizacin de componentes del programa Aumenta la claridad Facilita el mantenimiento
Arquitectura propuesta
Los requerimientos funcionales se implementan en la ventana principal:
Hay UN mtodo por REQUERIMIENTO La ventana principal coordina todas las acciones
principal
principal
Quin es principal?
R// Es el objeto que contiene la ventana principal
Dnde est ?
R// Es un atributo (asociacin) de las clases panelResultados y panelVehiculo
Quin lo conoce ?
Entonces
public class PanelVehiculo extends JPanel implements ActionListener { La clase del panel private InterfazImpuestosCarro principal; contiene un atributo del public PanelVehiculo( InterfazImpuestosCarro v) { principal = v; } }
Entonces
public class PanelVehiculo extends JPanel implements ActionListener { private InterfazImpuestosCarro principal; public PanelVehiculo( InterfazImpuestosCarro v) { principal = v; } }
El mtodo constructor del panel DEBE recibir como parmetro, el objeto correspondiente a la ventana principal
Entonces
public class PanelVehiculo extends JPanel implements ActionListener { private InterfazImpuestosCarro principal; public PanelVehiculo( InterfazImpuestosCarro v) { principal = v; } Se asigna el parmetro }
al atributo
Entonces
public class InterfazImpuestosCarro extends JFrame { private PanelVehiculo panelVehiculo; private PanelDescuentos panelDescuentos; private PanelResultados panelResultados; public InterfazImpuestosCarro( ) throws Exception { setLayout( new BorderLayout( ) ); panelVehiculo = new PanelVehiculo( this ); add( panelVehiculo, BorderLayout.NORTH ); panelDescuentos = new PanelDescuentos( ); add( panelDescuentos, BorderLayout.CENTER ); panelResultados = new PanelResultados( this ); add( panelResultados, BorderLayout.SOUTH ); }
Entonces
public class InterfazImpuestosCarro extends JFrame { private PanelVehiculo panelVehiculo; private PanelDescuentos panelDescuentos; private PanelResultados panelResultados; public InterfazImpuestosCarro( ) throws Exception { setLayout( new BorderLayout( ) ); panelVehiculo = new PanelVehiculo( this ); add( panelVehiculo, BorderLayout.NORTH ); panelDescuentos = new PanelDescuentos( ); add( panelDescuentos, BorderLayout.CENTER ); panelResultados = new PanelResultados( this ); add( panelResultados, BorderLayout.SOUTH ); }
Entonces
public class InterfazImpuestosCarro extends JFrame { private PanelVehiculo panelVehiculo; private PanelDescuentos panelDescuentos; private PanelResultados panelResultados; public InterfazImpuestosCarro( ) throws Exception { setLayout( new BorderLayout( ) ); panelVehiculo = new PanelVehiculo( this ); add( panelVehiculo, BorderLayout.NORTH ); panelDescuentos = new PanelDescuentos( ); add( panelDescuentos, BorderLayout.CENTER ); panelResultados = new PanelResultados( this ); add( panelResultados, BorderLayout.SOUTH ); }
Se pasa como parmetro la ventana principal (this) a los mtodos constructores de los paneles que la necesitan
Entonces
public class InterfazImpuestosCarro extends JFrame { private PanelVehiculo panelVehiculo; private PanelDescuentos panelDescuentos; private PanelResultados panelResultados; public InterfazImpuestosCarro( ) throws Exception { setLayout( new BorderLayout( ) ); panelVehiculo = new PanelVehiculo( this ); add( panelVehiculo, BorderLayout.NORTH ); panelDescuentos = new PanelDescuentos( ); add( panelDescuentos, BorderLayout.CENTER ); panelResultados = new PanelResultados( this ); add( panelResultados, BorderLayout.SOUTH ); }
Recordemos (1 de 6 pasos)
Recordemos (2 de 6 pasos)
public class PanelResultados extends JPanel implements ActionListener { public void actionPerformed (ActionEvent evento ) { String comando = evento.getActionCommand( ); El panel reacciona al if ( (comando.equals( LIMPIAR) ) evento con SU mtodo { actionPerformed dentro principal.limpiar( ); del cual se analiza el } evento y se llama al else if (comando.equals( CALCULAR ) ) mtodo correspondiente { de la ventana principal principal.calcularImpuestos( ); } }
Entonces
public class PanelVehiculo extends JPanel implements ActionListener { public String darMarca( ) { return txtMarca.getText( ); }
Volviendo al paso 3 de 6
public void calcularImpuestos( ) { String unaMarca = panelVehiculo.darMarca( ); String unaLinea = panelVehiculo.darLinea( ); String unModelo = panelVehiculo.darModelo( );
Volviendo al paso 3 de 6
public void calcularImpuestos( ) { String unaMarca = panelVehiculo.darMarca( ); String unaLinea = panelVehiculo.darLinea( ); String unModelo = panelVehiculo.darModelo( ); if( unaMarca.equals( "" ) || unaLinea.equals( "" ) || unModelo.equals( "" ) ) { JOptionPane.showMessageDialog( this, "Por favor llene todos los datos", "Clculo de Impuestos", JOptionPane.ERROR_MESSAGE ); } else { . Completa la informacin } }
Volviendo al paso 3 de 6
public void calcularImpuestos( ) { String unaMarca = panelVehiculo.darMarca( ); String unaLinea = panelVehiculo.darLinea( ); String unModelo = panelVehiculo.darModelo( ); if( unaMarca.equals( "" ) || unaLinea.equals( "" ) || unModelo.equals( "" ) ) { JOptionPane.showMessageDialog( this, "Por favor llene todos los datos", "Clculo de Impuestos", JOptionPane.ERROR_MESSAGE ); } else { . En caso de problema, puede } cancelar la reaccin y notificar al }
Entonces
La ventana principal DEBE conocer el mundo para poder llamar a sus mtodos
principal calculador
principal
Entonces
public class InterfazImpuestosCarro extends JFrame { /** Calculador de impuestos */ private CalculadorImpuestos calculador; .
public InterfazImpuestosCarro( ) throws Exception { // Crea el calculador de impuestos calculador = new CalculadorImpuestos( ); // Configura la informacin de la ventana setTitle( "Clculo impuestos" ); } }
La clase de la ventana principal contiene un atributo que es el objeto del mundo (de la clase principal del mundo)
Entonces
public class InterfazImpuestosCarro extends JFrame { /** Calculador de impuestos */ private CalculadorImpuestos calculador; .
public InterfazImpuestosCarro( ) throws Exception { // Crea el calculador de impuestos calculador = new CalculadorImpuestos( ); // Configura la informacin de la ventana setTitle( "Clculo impuestos" ); } }
Volviendo al paso 4 de 6
public void calcularImpuestos( ) { if( unaMarca.equals( "" ) || { JOptionPane.showMessageDialog } else { boolean descProntoPago = panelDescuentos.hayDescuentoProntoPago( ); boolean descServicioPublico = panelDescuentos.hayDescuentoServicioPublico( ); boolean descTrasladoCuenta = panelDescuentos.hayDescuentoTrasladoCuenta( ); try { double pago = calculador.calcularPago( unaMarca, unaLinea, unModelo, descProntoPago, descServicioPublico, descTrasladoCuenta ); panelResultados.refrescarPago( pago ); } catch( Exception e ) { JOptionPane.showMessageDialog( this, e.getMessage( ), "Clculo de Impuestos", JOptionPane.WARNING_MESSAGE ); } } }
Entonces
/** * Cambia el valor desplegado del pago (Panelresultados) existe * @param pago - nuevo pago a desplegar el mtodo refrescarPago */ public void refrescarPago( double pago ) { //Despliega el valor del vehiculo DecimalFormat df = ( DecimalFormat )NumberFormat.getInstance( ); df.applyPattern( "$ ###,###.##" ); txtTotal.setText( df.format( pago ) ); }
Entonces
/** * Cambia el valor desplegado del pago Utiliza la clase * @param pago - nuevo pago a desplegar DecimalFormat de Java */ para dar un formato public void refrescarPago( double pago ) especial a un nmero { //Despliega el valor del vehiculo DecimalFormat df = ( DecimalFormat )NumberFormat.getInstance( ); df.applyPattern( "$ ###,###.##" ); txtTotal.setText( df.format( pago ) ); }
Entonces
/** * Cambia el valor desplegado del pago * @param pago - nuevo pago a desplegar */ public void refrescarPago( double pago ) { //Despliega el valor del vehiculo DecimalFormat df = ( DecimalFormat )NumberFormat.getInstance( ); df.applyPattern( "$ ###,###.##" ); txtTotal.setText( df.format( pago ) ); }
Pone el valor del pago en la zona de texto llamada txtTotal, en formato String
Mensajes en la Consola
System.out.println(Este en un mensaje de prueba de ERROR);
Si se ejecuta desde eclipse, el mensaje aparece en la ventana Console
JOptionPane.showMessageDialog( null, "La marca ferrari no est registrada", "Calculo de Impuestos", JOptionPane.WARNING_MESSAGE );
JOptionPane.showConfirmDialog
int resp = JOptionPane.showConfirmDialog( null, "Est seguro que lo desea borrar?", "Confirmacion", JOptionPane.YES_NO_OPTION); if ( resp == JOptionPane.YES_OPTION) {
...
}