COMPONENTES DE LA INTERFAZ GRAFICA DE : PARTE 1 13.1 Introducción GUI: Interfaz gráfica de . GUI: presenta un mecanismo amigable al para interactuar con un programa: ya que a este último le proporciona una “apariencia visual” única. Las GUI: Las GUI se crean a partir de componentes de la GUI (también conocidos como controles o widgets [rios de ventana]). Componentes de la GUI: un componente de la GUI es un objeto con el cual interactúa el mediante el ratón, el teclado, u otra forma de entrada, como el reconocimiento de voz. 13.2 Generalidades de los componentes de swing Componente JLabel JtextField
Descripción Área donde pueden mostrarse iconos o texto no editables. Área en el que el introduce datos desde el teclado. Esta área también puede mostrarse información. Jbutton Área que, cuando el ratón hace clic sobre ella, desencadena un evento. JcheckBox Componente de la GUI que puede estar o no seleccionado. JcomboBok Lista desplegable de elementos, de los cuales el puede seleccionar uno haciendo clic en el o posiblemente escribiendo dentro del cuadro. Jlist Área que contiene una lista de elementos, de los cuales el puede seleccionar cualquiera haciendo clic en el. Pueden seleccionarse varios elementos. J Contenedor en el cual pueden colocarse y organizarse componentes Figura 13.2 Algunos componentes de la GUI básicas. En la figura 13.3 se muestra una jerarquía de herencia, la cual contiene clases que declaran atributos y comportamientos comunes para la mayoría de los componentes de Swing. La clase Object es la superclase de la jerarquía de clases de java. La clase Component (paquete java.awt) es una subclase de Object; la clase Container (paquete java.awt) es una subclase de JComponent; y la clase JComponent (paquete javax.swing) es una subclase de Container. Una clase que extienda a la clase Component es una Component. Por ejemplo la clase Container extiende a la clase Component y la clase Component extiende a Object. Por lo tanto, una Container es una Component y es una Object. Una clase que extiende a la clase Container es una Container. Por lo tanto, una JComponent es una Container. Las clases Component pueden organizarse mediante clases Container. Como una clase Container es una Component, una GUI puede estructurarse con las clases Container adjuntas a otras clases Container.
Observación de ingeniería de software Para utilizar componentes de la GUI efectivamente, las jerarquías de herencia de javax.swing y java.awt deben comprenderse; especialmente la clase Component, la clase Container, y la clase JComponent, que declaran características comunes para la mayoría de los componentes de Swing.
Figura 13.3 Superclases comunes de muchos de los componentes de swing. La clase Component: declara atributos y comportamientos comunes de todas las subclases de Component. Recuerde: con muchas excepciones, la mayoría de los componentes de la GUI extienden a la clase Component en forma directa o indirecta. Paint y repaint: Un método que se origina en la clase Component y que hemos utilizado frecuentemente en subprogramas (applets) es paint. Otro método descrito previamente que se origina en Component es repaint. La clase Container: istra una colección de componentes relacionados. Add y setLayout: un método que se origina en la clase Container es add el cual se utiliza para adjuntar componentes al de contenido (un objeto Container). Otro método que se origina en la clase Container es setLayout, el cual permite a un programa especificar el de esquemas que ayuda a un Container a posicionar y ajustar el tamaño de sus componentes. La clase JComponent: es la superclase de la mayoría de los componentes de Swing. Esta clase declara los atributos y comportamientos comunes de todas las subclases de JComponent, incluyendo.
1. Una apariencia visual adaptable, la cual puede utilizarse para personalizar la apariencia de los componentes (por ejemplo, para usarlos en plataformas específicas). 2. Teclas de método abreviado (llamadas nemónicos) para un directo a los componentes de la GUI por medio del teclado. 3. Herramientas manejadoras de eventos comunes, para casos en los que varios componentes de la GUI inician las mismas acciones en una aplicación. 4. Breves descripciones del propósito de un componente de la GUI (lo que se conoce como cuadros de información sobre herramientas o tool tips) que se muestran cuando el cursor del ratón se coloca sobre el componente durante un breve periodo. 5. Soporte para tecnologías de ayuda, como lectores de pantalla Braille para las personas con impedimentos visuales. 6. Soporte para la localización de la interfaz de ; es decir, personalizar la interfaz de para mostrarla en distintos lenguajes y utilizar las convenciones de la cultura local.
13.3 JLabel Etiquetas: las etiquetas proporcionan instrucciones de texto o información en una GUI. Las etiquetas: se definen mediante la clase JLabel, una subclase de JComponent. Una etiqueta: una etiqueta muestra una sola línea de texto de solo lectura, una imagen o texto con una imagen. etiqueta1 = new JLabel("Etiqueta con texto"); etiqueta1.setToolTipText("Esta es la etiqueta1"); contenedor.add(etiqueta1); Se utiliza el método setToolTipText (heredado por JLabel de Component) para especificar la información sobre herramientas que se muestra cuando el coloca el cursor del ratón sobre la etiqueta en la GUI. ImageIcon: soporta varios formatos de imagen incluyendo (GIF) Formato de intercambio de gráficos, (PNG) Gráficos portables de red y (JPEG) Grupo de expertos unidos en fotografía. Los nombres de archivos para cada uno de estos tipos termina con .gif, .png o .jpg (o .jpeg), respectivamente. Recuerde: la clase ImageIcon implementa a la interfaz Icon; un objeto ImageIcon es un objeto Icon.
Icon insecto = new ImageIcon(getClass().getResource("AlbumArtSmall.jpg")); etiqueta2 = new JLabel("Etiqueta con texto e icono", insecto, SwingConstants.LEFT); etiqueta2.setToolTipText("Esta es la etiqueta2"); contenedor.add(etiqueta2); Un objeto JLabel puede mostrar un Icon. En la línea de arriba se utiliza otro constructor de JLabel para crear una etiqueta que muestra el texto “Etiqueta con texto e icono” y el Icono al que insecto hace referencia. El último argumento para el constructor indica que el contenido de la etiqueta se debe justificar a la izquierda, o alinear a la izquierda (es decir, el icono y el texto se encuentran del lado izquierdo del área de la etiqueta en la pantalla). La expresión getClass().getResource( "AlbumArtSmall.jpg " ) invoca al método getClass(heredado de la clase Object) para obtener una referencia al objeto Class que representa la declaración de la clase PruebaEtiqueta. Después, esa referencia se utiliza para invocar al método getResource de Class, el cual devuelve la ubicación de la imagen como un URL. El constructor de ImageIcon utiliza el URL para localizar la imagen, y después la carga en la memoria. Como vimos en el capítulo 1, la JVM carga las declaraciones de las clases en la memoria, usando un cargador de clases. El cargador de clases sabe en dónde se encuentra localizada en el disco cada clases que carga. El método getResource utiliza el cargador de clases del objeto Class para determinar la ubicación de un recurso, como un archivo de imagen. En este ejemplo, el archivo de imagen se almacena en la misma ubicación que el archivo PruebaEtiqueta.class. Las técnicas aquí descritas permiten que una aplicación cargue archivos de imagen de ubicaciones que son relativas al archivo .class de PruebaEtiqueta en disco.
SwingConstants: La interfaz SwingConstants (paquete javax.swing) declara un conjunto de constantes enteras comunes (como SwingConstants.LEFT) que se utilizan con muchos componentes de Swing. De manera predeterminada, el texto aparece a la derecha de una imagen cuando una etiqueta Contiene tanto texto como una imagen. setHorizontalAlignment y setVerticalAlignment: Las alineaciones horizontal y vertical de un objeto JLabel se pueden establecer mediante los métodos setHorizontalAlignment y setVerticalAlignment, respectivamente. Error común de programación Una excepción NullPointerException Observación de apariencia visual 13.3 Use cuadros de información sobre herramientas para agregar texto descriptivo a sus componentes de GUI. Este texto ayuda al a determinar el propósito del componente de GUI en la interfaz de . JFrame: la clase JFrame proporciona los atributos y comportamientos básicos de una ventana: una barra de titulo en la parte superior, y botones para minimizar, maximizar y cerrar la ventana. IDE (Integrated Development Environment) Entorno de desarrollo integrado.
Recuerde: java cuenta con varios es de esquemas que pueden ayudarle a colocar los componentes. IDE: Muchos entornos de desarrollo integrados (IDE) proporcionan herramientas de diseño de GUIs, en las cuales podemos especificar el tamaño y la ubicación exactos de un componente en forma visual utilizando el ratón, y después el IDE genera el código de la GUI por nosotros. Aunque dichos IDEs pueden simplificar considerablemente la creación de GUIs, sus capacidades son distintas. FlowLayout: es un de esquemas. FlowLayout: Uno de esos es es FlowLayout, en el cual los componentes de la GUI se colocan en un contenedor de izquierda a derecha, en el orden en el que el programa los une al contenedor. Cuando no hay más espacio para acomodar los componentes de izquierda a derecha, se siguen mostrando de izquierda a derecha en la siguiente línea. Si se cambia el tamaño del contenedor, un esquema FlowLayout reordena los componentes para dar cabida a la nueva anchura del contenedor, posiblemente con menos o más filas de componentes de la GUI. Error común de programación Si no agrega explícitamente un componente de GUI a un contenedor, el componente no se mostrará cuando aparezca el contenedor en la pantalla. Observación de apariencia visual Use cuadros de información sobre herramientas para agregar texto descriptivo a sus componentes de GUI. Este texto ayuda al a determinar el propósito del componente de GUI en la interfaz de . JLabel: La clase JLabel cuenta con muchos métodos para modificar la apariencia de una etiqueta, una ves que se crea una instancia de ésta. etiqueta3 = new JLabel(); etiqueta3.setText("Etiqueta con icono y texto en parte inferior"); etiqueta3.setIcon(insecto); etiqueta3.setHorizontalTextPosition(SwingConstants.CENTER); etiqueta3.setVerticalTextPosition(SwingConstants.BOTTOM); etiqueta3.setToolTipText("Esta es la etiqueta3"); contenedor.add(etiqueta3); Se crea un objeto JLabel e invoca a su constructor sin argumentos. Al principio, dicha etiqueta no tiene texto ni objeto Icon. La línea siguiente utiliza el método setText de JLabel para establecer el texto mostrado en la etiqueta. El método correspondiente getText obtiene el texto actual mostrado en la etiqueta. La línea siguiente utiliza el método setIcon de JLabel para especificar el objeto Icon a mostrar en la etiqueta. El correspondiente método getIcon obtiene el objeto Icon actual mostrado en una etiqueta. Las siguientes dos líneas utilizan los métodos setHorizontalTextPosition y setVerticalTextPosition de JLabel para especificar la siguiente posición del texto en la etiqueta. En este caso, el texto se centrará en forma horizontal y aparecerá en la parte inferior de la etiqueta. Por ende, el objeto Icon aparecerá por encima del texto. Las constantes de posición horizontal en SwingConstants son LEFT, CENTER y RIGHT (figura 13.4).
Las constantes de posición vertical en SwingConstants son TOP, CENTER y BOTTOM (fi gura 13.4). La línea siguiente establece el texto de información sobre herramientas para etiqueta3. La última línea agrega etiqueta3 al de contenido.
Figura 13.4 Algunos componentes GUI básicos. Recuerde: De manera predeterminada, al cerrar una ventana ésta simplemente se oculta. 13.4 Manejo de eventos Las GUI: están controladas por eventos (es decir, generan eventos cuando el del programa interactúa con la GUI). Algunos eventos comunes (interacciones) son mover el ratón, hacer clic con los botones del ratón, hacer clic en un botón de la pantalla, escribir en un campo de texto, seleccionar un elemento de un menú y cerrar una ventana. Cuando ocurre una interacción con el , se envía un mensaje al programa. La información de los eventos de la GUI se almacenan en un objeto de una clase que extiende a AWTEvent Recuerde: . Cuando el interactúa con un componente de la GUI, la interacción (conocida como un evento) controla el programa para que realice una tarea. En la figura 13.5 se muestra una jerarquía que contiene muchas de las clases de eventos del paquete java.awt.event. Algunas de estas clases de eventos se describirán en este capítulo y en el 14. Los tipos de eventos del paquete java.awt.event se utilizan con componentes de AWT y de Swing. Los tipos de eventos adicionales, específicos para Swing, se declaran en el paquete javax.swing.event.
Figura 13.5 Algunas clases de eventos del paquete java.awt.event. El mecanismo de manejo de eventos consta de tres partes: - El origen del evento. - El objeto del evento. - El componente de escucha del evento. El origen del evento: es el componente de la GUI específico con el cual interactúa el . El objeto del evento: encapsula la información acerca del evento que ocurrió. Esta información incluye una referencia al origen del evento y cualquier información específica de ese evento que pueda ser requerida por el componente de escucha del evento, para poder manejarlo. El componente de escucha del evento: es un objeto que recibe la notificación del origen del evento cuando este ocurre; en efecto, “escucha” a la espera de un evento y se ejecuta en respuesta a ese evento. El componente de escucha del evento recibe un objeto del evento cuando se le notifica que ocurrió este. Después utiliza el objeto para responder al evento. El origen del evento: se requiere para proveer métodos que permitan a los componentes de escucha ser registrados o no registrados. El origen del evento mantiene una lista de sus componentes de escucha registrados, y notifica a cada uno de ellos cuando ocurre un evento. El programador debe realizar dos tareas claves para procesar un evento de interfaz gráfica de en un programa - Debe registrar un componente de escucha de evento para el componente de la GUI que se espera genere ese evento.
-
Debe implementar un método manejador del evento (o un conjunto de métodos manejadores del evento)
Manejadores de eventos: los métodos manejadores de eventos se conocen comúnmente manejadores de eventos. Un componente de escucha de eventos para un evento de GUI es un objeto de una clase que implementa a una o más de las interfaces de escucha de eventos de los paquetes java.awt.event y javax.swing.event. Muchos de los tipos de componentes de escucha de eventos son comunes para los componentes de Swing y de AWT. Dichos tipos se declaran en el paquete java.awt.event, y algunos de ellos se muestran en la figura 13.6. Los tipos de escucha de eventos adicionales, específicos para los componentes de Swing, se declaran en el paquete javax. swing.event .
Figura 13.6 Algunas interfaces comunes de componentes de escucha de eventos del paquete java.awt.event
13.5 Campos de texto. JTextField y JField: los objetos JTextField y JField (paquete javax.swing) son áreas de una sola línea en las que el puede introducir textos mediante el teclado, o el programa puede mostrar texto. JField: un objeto JField muestra que los caracteres se están escribiendo a medida que el los introduce, pero oculta los caracteres actuales, suponiendo que representa una contraseña que no debe conoce nadie más que aparte del . Recuerde: cuando el escribe datos en uno de estos campos y oprime intro, ucurre un evento de acción. JTextField: la clase JTextField extiende a la clase JTextComponent (paquete javax.swing.text), la cual proporciona muchas características comunes a los componentes basados en texto de Swing. JField: la clase JField entiende a JTextField y agrega varios métodos específicos para el procesamiento de contraseñas. campoTexto1 = new JTextField(10); Se crea campoTexto1 con 10 columnas de texto. El tamaño en pixeles de una columna de texto se determina en base a la anchura promedio de un carácter en el tipo de letra actual del campo de texto. campoTexto2 = new JTextField("Escriba el texto aquí"); contenedor.add(campoTexto2); Se crea campoTexto2 con el texto inicial "Escriba el texto aquí" a mostrar en el campo de texto. La anchura del campo de texto se determina en base a la anchura del texto predeterminado. En la siguiente línea se agrega campoTexto2 al de contenido. campoTexto3 = new JTextField("Campo de texto no editable", 15); campoTexto3.setEditable(false); contenedor.add(campoTexto3); se crea campoTexto3 y se llama al constructor de JTextField con dos argumentos: el texto predeterminado "Campo de texto no editable" a mostrar y el número de columnas especificadas. En la siguiente línea se utiliza el método setEditable (heredado en JTextField de la clase JTextComponent) para hacer que el campo de texto no pueda editarse; es decir, el no podrá modificar el texto en este campo de texto. En la última línea se agrega campoTexto3 al de contenido. campoContrasenia = new JField("Texto oculto"); contenedor.add(campoContrasenia);
Se crea campoContrasenia con el texto "Texto oculto" a mostrar en el campo de texto. La anchura de este campo de texto se determina en base a la anchura del texto predeterminado. En la siguiente línea se agrega campoContrasenia al de contenido. ManejadorCampoTexto manejador = new ManejadorCampoTexto(); Se crea una instancia de la clase ManejadorCampoTexto y se asigna su referencia a manejador campoTexto1.addActionListener(manejador); campoTexto2.addActionListener(manejador); campoTexto3.addActionListener(manejador); campoContrasenia.addActionListener(manejador); En estas líneas están las instrucciones de registros de eventos que especifican al objeto de escucha de eventos para cada componente de la GUI. El programa llama al método addActionListener de JTextField para registrar el evento para cada componente. El método addActionListener recibe como su argumento un objeto ActionListener. Por lo tanto, cualquier objeto de una clase que implemente a la interfaz ActionListener (es decir, cualquier objeto que sea un ActionListener) podrá suministrarse como argumento para este método. El objeto al que manejador hace referencia es un ActionListener ya que su clase implementa a la interfaz ActionListener Recuerde: El método addActionListener recibe como su argumento un objeto ActionListener. Nota Importante: Por lo tanto, cualquier objeto de una clase que implemente a la interfaz ActionListener (es decir, cualquier objeto que sea un ActionListener) podrá suministrarse como argumento para este método. Observación de ingeniería de software El componente de escucha de eventos para cierto evento debe implementara la interfaz de escucha de eventos apropiada. getSource() para determinar el componente de la GUI con el cual interactúo el . getActionCommand() El método getActionCommand() de ActionEvent devuelve el texto en el objeto JTextField que genero el evento. get(): se usa el método get() de JField para obtener la contraseña y crear la cadena amostrar. JTextField: Incluso hasta un objeto JTextField no editable puede generar un evento; simplemente haga clic en el campo de texto y oprima intro
13.6 Como funciona el manejo de eventos. Recuerde: todo componente del GUI soporta varios tipos de eventos, incluyendo eventos de ratón, eventos de tecla y otros más. Cuando ocurre un evento, este se despacha solamente a los componentes de escucha de eventos del tipo apropiado. El despachamiento: (dispaching) es simplemente el proceso por el cual se llama al método manejador de eventos apropiado en cada componente de escucha registrados, para el tipo de evento que ocurrió. Cada tipo de evento tiene uno o más interfaces de escucha de eventos correspondientes. Por ejemplo, los eventos tipo ActionEvent son manejados por objetos ActionListener, los eventos tipo MouseEvent son manejados por objetos MouseListener y MouseMotionListener, y los eventos tipo KeyEvent son manejados por objetos KeyListener. ID de evento: Cuando ocurre un evento, el componente de la GUI recibe un ID de evento único, el cual especifica el tipo de evento. El componente de la GUI utiliza el ID de evento para decidir a cuál tipo de componente de escucha debe despacharse el evento, y para decidir cuál método llamar en cada objeto de escucha. Para un ActionEvent, el evento se despacha al método actionPerformed de todos los objetos ActionListener registrados (el único método en la interfaz ActionListener). En el caso de un MouseEvent, el evento se despacha a todos los objetos MouseListener o MouseMotionListener registrados, dependiendo del evento de ratón que ocurra. El ID de evento del objeto MouseListener determina cuáles de los varios métodos manejadores de eventos de ratón son llamados. 13.7 JButton. Botón: Un botón es un componente en el que el hace clic para desencadenar cierta acción. Tipos de botones: - Botones de comando. - Casillas de verificación. - Botones interruptores. - Botones de opción. En la figura 11.14 se muestra la jerarquía de herencia de los botones de Swing que veremos en este capítulo. Como puede ver en el diagrama, todos los tipos de botones son subclases de AbstractButton (paquete javax.swing), la cual declara las características comunes para los botones de Swing. En esta sección nos concentraremos en los botones que se utilizan comúnmente para iniciar un comando.
Figura 13.9 jerarquía de botones de Swing. Botón de comando: un botón de comando genera un evento ActionEvent cuando el hace clic en él. Los botones de comando se crean con la clase JButton, la cual extiende a la clase AbstractButton. Etiqueta del botón: el texto en la cara de un objeto JButton se llama etiqueta del botón. Una GUI puede tener muchos objetos JButton, pero cada etiqueta de botón debe generalmente ser única en las partes de la GUI en que se muestre. Observación de apariencia visual Tener más de un objeto JButton con la misma etiqueta hace que los objetos JButton sean ambiguos para el . Debe proporcionar una etiqueta única para cada botón. JButton: Un objeto JButton puede mostrar un objeto Icon. Para proveer al un nivel adicional de interacción visual con la GUI, botonSimple = new JButton("Boton Simple"); contenedor.add(botonSimple); En la primera línea se crea botonSimple con la etiqueta "Boton simple". En la segunda línea se agrega el botón al de contenido. botonElegante = new JButton("Boton elegante", Android1); botonElegante.setRolloverIcon(Android2); contenedor.add(botonElegante); En la línea primera se crea botonElegante con el texto "Boton elegante" y el icono Android1. De manera predeterminada, el texto se muestra a la derecha del icono. En la línea segunda se utiliza el método setRolloverIcon (heredado de la clase AbstractButton) para especificar la imagen a
mostrar en el botón cuando el coloque el ratón sobre el botón. En la línea tercera se agrega el botón al de contenido.
Observación de apariencia visual Como la clase AbstractButton soporta el mostrar texto e imágenes en un botón, todas las subclases de Abstract-Button soportan también el mostrar texto e imágenes. Observación de apariencia visual 11.10 Al usar iconos de sustitución para los objetos JButton, los s reciben una retroalimentación visual que les indica que, al hacer clic en el ratón mientras el cursor está colocado encima del botón, ocurrirá una acción. Recuerde: Los objetos JButton, al igual que los objetos JTextField, generan eventos ActionEvent que pueden ser procesados por cualquier objeto ActionListener. getActionCommand: Para un evento de JButton, el método getActionCommand de ActionEvent devuelve la etiqueta del botón. Cómo acceder a la referencia this en un objeto de una clase de nivel superior desde una clase interna Cuando ejecute esta aplicación y haga clic en uno de sus botones, observe que el diálogo de mensaje que aparece está centrado sobre la ventana de la aplicación. Esto ocurre debido a que la llamada al método showMessageDialog de JOptionPane utiliza a PruebaBoton.this, en vez de null como el primer argumento. Cuando este argumento no es null, Representa lo que se denomina el componente de GUI padre del diálogo de mensaje (en este caso, la ventana de aplicación es el componente padre) y permite centrar el diálogo sobre ese componente, cuando se muestra el diálogo. PruebaBoton.this representa a la referencia this del objeto de la clase PruebaBoton de nivel superior. Observación de ingeniería de software Cuando se utiliza en una clase interna, la palabra clave this se refiere al objeto actual de la clase interna que se está manipulando. Un método de la clase interna puede utilizar la referencia this del objeto de la clase externa, si antepone a this el nombre de la clase externa y un punto, como en PruebaBoton.this. 13.8 JCheckBox y JRadioButton. Botones de estado - JToggleButton - JCheckBox - JRadioButton Botones de estado: los cuales tienen valores de encendido/apagado o verdadero/falso. JCheckBox y JRadioButton: Las clases JCheckBox y JRadioButton son subclases de JToggleButton.
JCheckBox campo = new JTextField("Observe el cambio en el estilo de tipo de letra", 25); campo.setFont( new Font("Serif", Font.PLAIN, 14) ); contenedor.add(campo); Una vez creado e inicializado el objeto JTextField en la segunda línea se utiliza el método setFont (heredado por JTextField indirectamente de la clase Component) para establecer el tipo de letra del objeto JTextField con un nuevo objeto de la clase Font (paquete java.awt). El nuevo objeto Font se inicializa con "Serif" (un nombre de tipo de letra genérico que representa un tipo de letra como Times, y se soporta en todas las plataformas de Java), estilo Font.PLAIN y tamaño de 14 puntos. negrita = new JCheckBox("Negrita"); contenedor.add(negrita); cursiva = new JCheckBox("Cursiva"); contenedor.add(cursiva); A continuación, en las líneas 1ra y 4ta se crean dos objetos JCheckBox. La cadena que se pasa al constructor de JCheckBox es la etiqueta de la casilla de verificación que aparece a la derecha del objeto JCheckBox de manera predeterminada. Tipos de eventos: - ItemEvent - ActionEvent - ListSelectionEvent Cuando el hace clic en un objeto JCheckBox, ocurre un evento ItemEvent. Este evento puede manejarse mediante un objeto ItemListener, que debe implementar al método itemStateChanged. ManejadorCasillaVerificacion manejador = new ManejadorCasillaVerificacion(); negrita.addItemListener(manejador); cursiva.addItemListener(manejador); En las líneas de arriba se crea una instancia de la clase ManejadorCasillaVerificacion y se registra con el método addItemListener como componente de escucha para ambos objetos JCheckBox. private class ManejadorCasillaVerificacion implements ItemListener { private int valNegrita = Font.PLAIN; //CONTROLA EL ESTILO DE TIPO DE LETRA NEGRITA private int valCursiva = Font.PLAIN; //CONTROLA EL ESTILO DE TIPO DE LETRA CURSIVA //RESPONDER A EVENTOS DE CASILLA DE VERIFICACION public void itemStateChanged(ItemEvent evento) { //PROCESAR EVENTOS DE CASILLA DE VERIFICACION NEGRITA if(evento.getSource() == negrita) valNegrita = negrita.isSelected() ? Font.BOLD : Font.PLAIN;
//PROCESAR EVENTOS DE CASILLA DE VERIFICACION CURSIVA if(evento.getSource() == cursiva) valCursiva = cursiva.isSelected() ? Font.ITALIC : Font.PLAIN; //ESTABLECER TIPO DE LETRA DEL CAMPO DE TEXTO campo.setFont( new Font("Serif", valNegrita + valCursiva, 14) ); }//FIN DEL METODO itemStateChanged En las líneas de arriba se declaran variables de instancia para la clase interna ManejadorCasillaVerificacion. En conjunto, estas variables representan el estilo de tipo de letra para el texto que se muestra en el objeto JTextField. Al principio ambas son Font.PLAIN para indicar que el tipo de letra no es negrita y no es cursiva. El método itemStateChanged es llamado cuando el hace clic en el objeto JCheckBox negrita o cursiva. Este método utiliza evento.getSource() para determinar en cuál de los objetos JCheckBox se hizo clic. Si fue en la casilla negritaJCheckBox, en la línea 51 se utiliza el método isSelected de JCheckBox para determinar si el botón está seleccionado (es decir, marcado). Si es así, a la variable local valNegrita se le asigna Font.BOLD; en caso contrario, se le asigna Font.PLAIN. Una instrucción similar se ejecuta si el hace clic en cursivaJCheck-Box. Si esta casilla de verificación está seleccionada, a la variable local valCursiva se le asigna Font.ITALIC; en caso contrario, se le asigna Font.PLAIN. evento.getSource()Este método se utiliza para determinar en cuál de los componentes se generó el evento. isSelected: Este método se utiliza para determinar si el botón está seleccionado (es decir, marcado). Font: Cada una de las constantes de Font representa un valor único. Font.PLAIN tiene el valor 0, por lo que si tanto valNegrita como valCursiva se establecen en Font.PLAIN, el tipo de letra tendrá el estilo simple. Font.BOLD o Font.ITALIC Si uno de los valores es Font.BOLD o Font.ITALIC, el tipo de letra estará en negrita o en cursiva, respectivamente. Si uno es BOLD y el otro es ITALIC, el tipo de letra estará en negrita y en cursiva. Clase interna: Una clase interna tiene una relación especial con su clase de nivel superior; a la clase interna se le permite acceder directamente a todas las variables de instancia y métodos de la clase de nivel superior. JRadioButton Los botones de opción (que se declaran con la clase JRadioButton) son similares a las casillas de verificación, en cuanto a que tienen dos estados: seleccionado y no seleccionado (al que también se le conoce como deseleccionado).
Botones de opción: Sin embargo, los botones de opción generalmente aparecen como un grupo, en el cual sólo un botón de opción puede estar seleccionado en un momento dado.
Botones de opción: Al seleccionar un botón de opción distinto en el grupo se obliga a que todos los demás botones de opción del grupo se deseleccionen. Botones de opción: Los botones de opción se utilizan para representar un conjunto de opciones mutuamente exclusivas (es decir, no pueden seleccionarse varias opciones en el grupo al mismo tiempo). 13.9 JComboBox Un cuadro combinado (algunas veces conocido como lista desplegable) proporciona una lista de elementos, de la cual el puede seleccionar solamente uno. Cuadro combinado: Los cuadros combinados se implementan con la clase JComboBox, la cual extiende a la clase JComponent. JComboBox: Los objetos JComboBox generan eventos ItemEvent, al igual que los objetos JCheckBox y JRadioButton. JComboBox: El primer elemento que se agrega a un objeto JComboBox aparece como el elemento actualmente seleccionado al mostrar el objeto JComboBox. Los otros elementos se seleccionan haciendo clic en el objeto JComboBox, el cual se expande en una lista de la cual el puede hacer una selección. setMaximumRowCount: se utiliza el método setMaximumRowCount de JComboBox para establecer el máximo número de elementos a mostrar cuando el haga clic en el objeto JComboBox. Si hay elementos adicionales, el objeto JComboBox proporciona una barra de desplazamiento que permite al desplazarse por todos los elementos en la lista. El puede hacer clic en las fl echas de desplazamiento que están en las partes superior e inferior de la barra de desplazamiento para avanzar hacia arriba y hacia debajo de la lista, un elemento a la vez, o puede arrastrar hacia arriba y hacia abajo el cuadro de desplazamiento que está en medio de la barra de desplazamiento para desplazarse por la lista. Para arrastrar el cuadro de desplazamiento, mantenga presionado el botón izquierdo del ratón mientras éste se encuentra sobre el cuadro de desplazamiento, y mueva el ratón. Observación de apariencia visual Establezca el número máximo de filas en un objeto JComboBox a un valor que evite que la lista se expanda fuera de los límites de la ventana o subprograma en la que se utilice. Esta configuración asegurará que la lista se muestre correctamente cuando el la expanda. Clase interna anónima: una forma especial de clase interna que se declara sin un nombre y, por lo general, aparece dentro de la declaración de un método. Clase interna anónima: Al igual que las demás clases internas, una clase interna anónima puede acceder a los de su clase de nivel superior. Clase interna anónima: Sin embargo, una clase interna anónima tiene limitado a las variables locales del método en el que está declarada.
Clase interna anónima: Como una clase interna anónima no tiene nombre, un objeto de la clase interna anónima debe crearse en el punto en el que se declara la clase. Observación de ingeniería de software Una clase interna anónima declarada en un método puede acceder a las variables de instancia y los métodos del objeto de la clase de nivel superior que la declaró, así como a las variables locales final del método, pero no puede acceder a las variables locales no final del método. getStateChange() El método getStateChange() determina el estado de un objeto JToogleButton. getSelectedIndex() determina el índice del elemento seleccionado en el objeto JComboBox con el método getSelectedIndex(). IDE: Por lo general, un IDE permite al programador diseñar una GUI en forma visual, y después el IDE genera código que implementa a la GUI. El programador sólo inserta instrucciones en los métodos manejadores de eventos que declaran cómo manejar cada evento. 13.10 JList Lista: Una lista muestra una serie de elementos, de la cual el puede seleccionar uno o más. Las listas: se crean con la clase JList, que extiende directamente a la clase JComponent. JList: La clase JList soporta listas de selección simple (listas que permiten seleccionar solamente un elemento a la vez) y listas de selección múltiple (listas que permiten seleccionar cualquier número de elementos a la vez). setVisibleRowCount(5) se usa el método setVisibleRowCount(5) de JList para determinar el número de elementos que serán visibles en la lista. setSelectionMode() se utiliza el método setSelectionMode de JList para especificar el modo de selección de la lista. ListSelectionModel: la clase ListSelectionModel (del paquete javax.swing) declara tres constantes que especifican el modo de selección de un objeto JList: SINGLE_SELECTION (que permite seleccionar solamente un elemento en un momento dado), SINGLE_INTERVAL_SELECTION (para una lista de selección múltiple que permita la selección de varios elementos contiguos) y MULTIPLE_INTERVAL_SELECTION (para una lista de selección múltiple que no restrinja el número de elementos que pueden seleccionarse). JList: A diferencia de un objeto JComboBox, un objeto JList no proporciona una barra de desplazamiento si hay más elementos en la lista que el número de filas visibles. En este caso se utiliza un objeto JScrollPane para proporcionar la capacidad de desplazamiento.
Cada objeto JFrame en realidad consiste de tres niveles: - El fondo - El de contenido - El de vidrio El de contenido: aparece en frente del fondo, y es en donde se muestran los componentes de la GUI en el objeto JFrame. El de vidrio: se utiliza para mostrar cuadros de información sobre herramientas y otros elementos que deben aparecer enfrente de los componentes de la GUI en la pantalla. El de contenido: oculta por completo el fondo del objeto JFrame; por ende, para cambiar el color de fondo detrás de los componentes de la GUI, debe cambiar el color de fondo del de contenido. getContentPane: El método getContentPane devuelve una referencia al de contenido del objeto JFrame. setBackground: el cual establece el color de fondo del de contenido. getSelectedIndex() el método getSelectedIndex() de JList devuelve el índice del elemento seleccionado. 13.11 Listas de selección múltiple Listas de selección múltiple: permite al seleccionar varios elementos de un objeto JList. Una Lista SINGLE_INTERVAL_SELECTION: permite la selección de un rango contiguo de elementos en la lista. Para ello, haga clic en el primer elemento y después oprima (y mantenga oprimida) la tecla Mayús mientras hace clic en el último elemento a seleccionar en el rango. Una lista MULTIPLE_INTERVAL_SELECTION permite una selección de rango continuo, como se describe para una lista SINGLE_INTERVAL_SELECTION. Dicha lista permite que se seleccionen diversos elementos, oprimiendo y manteniendo oprimida la tecla Ctrl (a la que algunas veces se le conoce como la tecla de Control ) mientras hace clic en cada elemento a seleccionar. Para deseleccionar un elemento, oprima y mantenga oprimida la tecla Ctrl mientras hace clic en el elemento por segunda vez. //ESTABLECER OBJETO JList listaCopia listaCopia = new JList(); listaCopia.setVisibleRowCount(5); listaCopia.setFixedCellWidth(100); listaCopia.setFixedCellHeight(15); listaCopia.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); contenedor.add( new JScrollPane(listaCopia) ); En la 4ta línea se utiliza el método setFixedCellWidth de JList para establecer la anchura de listaCopia en 100 píxeles. En la 5ta línea se utiliza el método setFixedCellHeight de JList para establecer la altura de cada elemento en el objeto JList a 15 píxeles.
Listas de selección múltiple: una lista de selección múltiple no tiene un evento específico asociado para hacer selecciones múltiples. Listas de selección múltiple: Una lista de selección múltiple no tiene eventos para indicar que un ha realizado varias selecciones. //MANEJAR EVENTO DE BOTON public void actionPerformed(ActionEvent evento) { //COLOCAR VALORES SELECCIONADOS EN ListaCopia listaCopia.setListData( listaColores.getSelectedValues() ); } El método actionPerformed utiliza el método setListData de JList para establecer los elementos mostrados en listaCopia. getSelectedValues() se hace una llamada al método getSelectedValues() de listaColores, el cual devuelve un arreglo de objetos Object que representan los elementos seleccionados en listaColores. En este ejemplo, el arreglo devuelto se pasa como argumento al método setListData de listaCopia. Muchos estudiantes se preguntan cómo puede usarse la referancia listaCopia en la línea 40, aun cuando la aplicación no crea el objeto al cual hace referencia sino hasta la línea 50. Recuerde que el método actionPerformed (líneas 37 a 41) no se ejecuta sino hasta que el oprime el botón botonCopia, lo cual no puede ocurrir sino hasta que el constructor termine su ejecución y la aplicación muestre la GUI. En ese punto en la ejecución de la aplicación, listaCopia ya se ha inicializado con un nuevo objeto JList. 13.12 Manejos de eventos de ratón MouseListener y MouseMotionListener: son interfaces para manejar eventos de ratón. MouseInputListener: El paquete javax.swing.event contiene la interfaz MouseInputListener, la cual extiende a las Interfaces MouseListener y MouseMotionListener para crear una sola interfaz que contiene todos los métodos de MouseListener y MouseMotionListener. Los métodos de las interfaces MouseListener y MouseMotionListener se sintetizan en la figura 13.16
Figura: 13.16 Métodos de la interfaz MouseListener y MouseMotionListener. MouseEvent: cada uno de los métodos manejadores de eventos de ratón toma un objeto MouseEvent como su argumento. MouseEvent: Un objeto MouseEvent contiene información acerca del evento de ratón que ocurrió, incluyendo las coordenadas x y y de la ubicación en donde ocurrió el evento. Estas coordenadas se miden desde la esquina superior izquierda del componente de la GUI en el que ocurrió el evento. Coordenada x: Las coordenadas x empiezan en 0 y se incrementan de izquierda a derecha. Coordenada y: Las coordenadas y empiezan en 0 y se incrementan de arriba hacia abajo. InputEvent: Además, los métodos y constantes de la clase InputEvent (superclase de MouseEvent) permiten a una aplicación determinar cuál fue el botón del ratón que oprimió el .
15 MANEJO DE EXCEPCIONES 15.1 Introducción Excepción: Una excepción es la indicación de un problema que ocurre durante la ejecución de un programa. Excepción: El nombre “excepción” implica que el problema ocurre con poca frecuencia; si la “regla” es que una instrucción generalmente se ejecuta en forma correcta, entonces la “excepción a la regla” es cuando ocurre un problema. El manejo de excepciones le permite crear aplicaciones que puedan resolver (o manejar) las excepciones. Manejo de excepciones: En muchos casos, el manejo de una excepción permite que el programa continúe su ejecución como si no se hubiera encontrado el problema. Programas tolerantes a fallas y robustos (es decir, programas que traten con los problemas que puedan surgir sin dejar de ejecutarse). Tip para prevenir errores El manejo de excepciones ayuda a mejorar la tolerancia a fallas de un programa. 15.2 Generalidades acerca del manejo de excepciones Con frecuencia, los programas evalúan condiciones que determinan cómo debe proceder la ejecución. Considere el siguiente seudocódigo: Realizar una tarea Si la tarea anterior no se ejecutó correctamente Realizar el procesamiento de los errores Realizar la siguiente tarea Si la tarea anterior no se ejecutó correctamente Realizar el procesamiento de los errores … En este seudocódigo empezamos realizando una tarea; después, evaluamos si esa tarea se ejecutó correctamente. Si no lo hizo, realizamos el procesamiento de los errores. De otra manera, continuamos con la siguiente tarea. Aunque esta forma de manejo de errores funciona, al entremezclar la lógica del programa con la lógica del manejo de errores el programa podría ser difícil de leer, modificar, mantener y depurar; especialmente en aplicaciones extensas. Tip de rendimiento Si los problemas potenciales ocurren con poca frecuencia, al entremezclar la lógica del programa y la lógica del manejo de errores se puede degradar el rendimiento del programa, ya que éste debe realizar pruebas (tal vez con frecuencia) para determinar si la tarea se ejecutó en forma correcta, y si se puede llevar a cabo la siguiente tarea.
Java: permite al programador tratar con el manejo de excepciones fácilmente, desde el comienzo de un proyecto. Observación de ingeniería de software Evite usar el manejo de excepciones para manipular los problemas en el flujo de control convencional. Manejar un número extenso de casos de excepciones puede ser incómodo: además, los programas con un número extenso de casos de excepciones pueden ser difíciles de leer y de mantener. Manejo de excepciones: el manejo de excepciones está diseñado para procesar errores sincrónicos, que ocurren cuando se ejecuta una instrucción. Errores sincrónicos: - Índices fuera de rango. - Desbordamiento aritmético (es decir, un valor fuera del rango representable de valores) - División entre cero. - Parámetros inválidos de método. - La interrupción de subprocesos - Asignación fallida de memoria (debido a la falta de ésta) Manejo de excepciones: el manejo de excepciones no está diseñado para procesar los problemas asociados con los eventos asíncronos (por ejemplo, completar las operaciones de E/S de disco, la llegada de mensajes de red, clics del ratón y pulsaciones de tecla), los cuales ocurren en paralelo y en forma independiente de, el flujo de control del programa. Observación de ingeniería de software Trate de incorporar una estrategia de manejo de excepciones en un sistema desde el comienzo del proceso de diseño. Puede ser difícil incluir un manejo efectivo de excepciones una vez que se haya implementado el sistema. Manejo de excepciones: el mecanismo de manejo de excepciones también es útil para procesar los problemas que ocurren cuando un programa invoca a los métodos de otra clase. Tip de rendimiento Cuando no ocurren excepciones, el código para manejar excepciones afecta muy poco, o nada, al rendimiento del programa. Debido a esto, los programas que implementan el manejo de excepciones operan con mucho más eficiencia que los programas que entremezclan el código para manejo de errores con la lógica del programa. Manejo de excepciones: el manejo de excepciones está dirigido a situaciones en las que el método que detecta un problema es incapaz de manejarlo. Dicho método lanza una excepción. No hay garantía de que habrá un manejador de excepciones (código que se ejecuta cuando el programa detecta una excepción) para procesar ese tipo de excepción. Si existe, el manejador de excepciones atrapa y maneja a esa excepción. El resultado de una excepción no atrapada a menudo produce efectos adversos y podrá terminar con le ejecución del programa. try: java proporciona las instrucciones try para permitir el manejo de excepciones
try: una instrucción try consiste de la palabra clave try, seguida por llaves ( { } ) que delimitan a ese bloque try. try: el bloque try contiene instrucciones que podrían ocasionar excepciones, e instrucciones que no deberían ejecutarse en caso de que ocurra una excepción. catch: debe haber por lo menos una clausula catch (a la que también se le llama manejador de excepciones) o una clausula finally inmediatamente después del bloque try. catch: cada clausula catch especifica entre paréntesis un parámetro de excepción, el cual identifica al tipo de excepción que puede procesar el manejador. El nombre del parámetro de excepción permite que la cláusula catch interactúe con el objeto de excepción atrapada. finally: después del último manejador catch, una clausula finally opcional proporciona código que siempre se ejecuta, sin importar que ocurra o no una excepción. Error común de programación Es un error de sintaxis colocar código entre un bloque try y su correspondiente clausula catch. Error común de programación Especificar una lista de parámetros de catch separada por comas es un error de sintaxis. Una instrucción catch solo puede tener un parámetro. Error común de programación Es un error de compilación atrapar el mismo tipo en dos clausulas catch distintas, asociadas con un bloque try especifico. Punto de lanzamiento: el punto en el programa en el que ocurra una excepción (es decir, la ubicación en la que un método detecta y lanza una excepción) se conoce como el punto de lanzamiento. Modelo de terminación del manejo de excepciones. Si ocurre una excepción en un bloque try, ese bloque termina inmediatamente y el control del programa se transfiere a la primera clausula catch que va después del bloque try. try: el bloque try que encierra a una excepción lanzada termina al ocurrir esa excepción. catch: a continuación, el programa busca la primera clausula catch que pueda procesar el tipo de excepción que ocurrió. El programa ubica la cláusula catch que concuerde, comparando el tipo de la excepción lanzada con el tipo del parámetro de excepción de cada cláusula catch, hasta que el programa encuentre una concordancia. La concordancia ocurre si los tipos son idénticos, o si el tipo de excepción lanzada es una subclase del tipo del parámetro de excepción. Cuando ocurre una concordancia, se ejecuta el código contenido dentro del manejador catch concordante. Cuando una clausula catch termina de procesarse, las variables locales que se declaran dentro de la cláusula (incluyendo su parámetro) quedan fuera del alcance. Cualquier clausula catch restante que corresponda a ese bloque try se ignora, y la ejecución continua en la primera línea de código después de la secuencia try/catch.
Observación de ingeniería de software Si usted sabe que un método podría lanzar una excepción, incluya el código apropiado para manejar excepciones en su programa. Esto hará que su programa sea más robusto. try: si no ocurren excepciones en un bloque try, el programa ignora el (los) manejador(es) para ese bloque. Recuerde: la ejecución del programa continúa con la siguiente instrucción que haya después de la secuencia try/catch. finally: si aparece una clausula finally después de la última clausula catch, la cláusula finally se ejecutará sin importar que ocurra o no una excepción. Recuerde: si ocurre una excepción en un método y no es atrapada, o si la instrucción que produjo la excepción no se encuentra dentro de un bloque try, el método que contiene la instrucción termina inmediatamente y el programa trata de localizar un bloque try circundante en el método que hizo la llamada. throws: en la declaración de un método, una clausula throws especifica las excepciones que lanza ese método. Esta cláusula aparece después de la lista de parámetros y antes del cuerpo del método. La cláusula contiene una lista separada por comas de las excepciones que lanzara el método, si ocurre un problema cuando este se ejecute. Dichas excepciones pueden ser lanzadas por instrucciones en el cuerpo, o pueden lanzarse mediante los métodos que se llamen en los cuerpos. throws: Un método puede lanzar excepciones de las clases que se listen en su cláusula throws, o en la de sus subclases. 15.2 Ejemplo de manejo de excepciones: División entre cero Recuerde: java no permite la división entre cero, en la aritmética con enteros. Cuando esto ocurre, java lanza una excepción ArithmeticException. Recuerde: [Nota: Java sí permite la división entre cero con valores de punto flotante. Dicho cálculo produce como resultado el valor de infi nito, que se representa en Java como un valor de punto flotante (pero en realidad aparece como la cadena Infinity)]. campoEntrada2.addActionListener(this); registra el objeto PruebaDivisionEntreCero como el objeto ActionListener para el objeto JTextField campoEntrada2. parseInt: el método parseInt lanza una excepción NumberFormatException si su argumento no representa a un entero valido. Las excepciones: en general, las excepciones pueden surgir a través del código mencionado en forma explícita en un bloque try, mediante llamadas a otros métodos o incluso a través de llamadas a métodos profundamente anidadas, incluidas por el código en un bloque try.
try: si el código en el bloque try no lanza (throw) una excepción, entonces se ignoran los manejadores catch que siguen después de ese bloque try, y la ejecución se reanuda en la primera línea de código que está después de los manejadores catch. catch(NumberFormatException exceptionFormatNumero) { JOptionPane.showMessageDialog(this, "Debe escribir dos enteros", "Formato de número invalido", JOptionPane.ERROR_MESSAGE); } Contiene la cláusula catch para una excepción NumberFormatException. Esta cláusula catch especifica que atrapará los objetos de excepción de tipo NumberFormatException (este tipo concuerda con el tipo de objeto de excepción lanzada en el método Integer.ParseInt) catch(ArithmeticException excepcionAritmetica) { JOptionPane.showMessageDialog(this, excepcionAritmetica.toString(), "Excepcion aritmetica", JOptionPane.ERROR_MESSAGE); } Contiene la cláusula catch para una excepción ArithmeticException. Esta cláusula catch especifica que atrapará los objetos de excepción de tipo ArithmeticException. Recuerde: en general, cuando el programa detecta una excepción mientras ejecuta un bloque try, atrapa la excepción en una clausula catch que especifica un tipo de excepción apropiado (es decir, el tipo en la cláusula catch concuerde exactamente con el tipo de excepción lanzada, o es una superclase del tipo de excepción lanzada). Recuerde: solo la cláusula catch que concuerde se ejecutará cuando ocurra una excepción. Recuerde: después de ejecutar una clausula catch, el flujo de control de un programa continúa con la primera instrucción que esta después de la última cláusula catch. Tip para prevenir errores Con el manejo de excepciones, un programa puede seguir ejecutándose después de hacerse cargo de un problema. Esto ayuda a asegurar que se desarrollen aplicaciones robustas, que contribuyan a lo que se conoce como computación de misión, o computación critica para los negocios. //PROCESAR LOS INTENTOS DE DIVIDIR ENTRE CERO catch(ArithmeticException excepcionAritmetica) { JOptionPane.showMessageDialog(this, excepcionAritmetica.toString(), "Excepcion aritmetica", JOptionPane.ERROR_MESSAGE); } El manejador ArithmeticException convierte la excepción en una cadena mediante toString(), y muestra está cadena como el mensaje en un cuadro de dialogo de mensaje de error.
15.3 Jerarquía de Excepciones en java
Figura 15.2 Jerarquía de herencia para la clase Throwable. La figura 15.2 muestra una pequeña porción de la jerarquía de herencia para la clase Throwable (una subclase de Object), que es la superclase de la clase Exception. Sólo pueden usarse objetos Throwable con el mecanismo para manejar excepciones. La clase Throwable tiene dos subclases: Exception y Error. La clase Exception y sus subclases (por ejemplo, RuntimeException, del paquete java.lang, e IOException, del paquete java.io) representan situaciones excepcionales que pueden ocurrir en un programa en Java, y que pueden ser atrapadas por la aplicación. La clase Error y sus subclases (por ejemplo, OutOfMemoryError) representan situaciones anormales que podrían ocurrir en la JVM. Los errores tipo Error ocurren con poca frecuencia y no deben ser atrapados por las aplicaciones; por lo general, no es posible que las aplicaciones se recuperen de los errores tipo Error. [Nota: la jerarquía de excepciones de Java contiene cientos de clases. En la API de Java puede encontrar información acerca de las clases de excepciones de Java. La documentación para la clase Throwable se encuentra en java.sun.com/javase/6/docs/api/java/lang/Throwable.html. En este sitio puede buscar las subclases de esta clase para obtener más información acerca de los objetos Exception y Error de Java]. Java clasifica a las excepciones en dos categorías: - excepciones verificadas - excepciones no verificadas.
Recuerde: El tipo de una excepción determina si es verificada o no verificada. Todos los tipos de excepciones que son subclases directas o indirectas de la clase RuntimeException (paquete java.lang) son excepciones no verificadas. Esto incluye a las excepciones que ya hemos visto, como las excepciones ArrayIndexOutOfBoundsException y ArithmeticException (que se muestran en la figura 15.2). Todas las clases que heredan de la clase Exception pero no de la clase RuntimeException se consideran como excepciones verificadas; y las que heredan de la clase Error se consideran como no verificadas. Recuerde: El compilador verifica cada una de las llamadas a un método, junto con su declaración, para determinar si el método lanza excepciones verificadas. De ser así, el compilador asegura que la excepción verificada sea atrapada o declarada en una cláusula throws. http://articulo.mercadolibre.com.mx/MLM-453346090-packs-de-4-tangas-en-talla-ch-o-med_JM 23 CONECTIVIDAD DE BASE DE DATOS EN JAVA CON JDBC Base de datos: es una colección organizada de datos. DBMS: sistema de istración de base de datos. DBMS: proporciona los mecanismos para almacenar y organizar datos en una manera consistente con el formato de la base de datos. DBMS: los sistemas de istración de base de datos permiten el y almacenamiento de datos sin necesidad de preocuparse por la representación interna. Bases de datos relacionales: en la actualidad, los sistemas de base de datos más populares son las bases de datos relacionales. SQL: es el lenguaje estándar internacional que se utiliza casi universalmente con las bases de datos relacionales para realizar consultas (es decir, para solicitar información que satisfaga ciertos criterios) y para manipular datos. RDBMS: algunos sistemas de istración de base de datos relacionados. Son: - SQL server. - Oracle. - Sybase. - DB2. - Informix. - MySQL. API JDBC: los programas en java se comunican con las bases de datos y manipulan sus datos utilizando la API JDBC. Controlador de JDBC: un controlador de JDBC implementa la interfaz para una base de datos especifica.
DBMS: la mayoría de los sistemas es de base de datos populares incluyen ahora controladores de JDBC. Base de datos relacional: es una representación lógica de datos que permiten acceder a estos sin necesidad de considerar la estructura física de estos datos. Base de datos relacional: una base de datos relacional almacena los datos en tablas. Tablas: las tablas están compuestas de filas, y las filas de columnas en la que se almacenan los valores. Clave principal: una clave principal es una columna (o grupo de columnas) en una tabla que tienen un valor único, el cual no puede duplicarse en las demás filas. Esto garantiza que cada fila se pueda identificarse por su clave principal. Columna: cada columna de una tabla representa un atributo de datos distinto. 23.4.1 Consulta básica SELECT Consulta SQL: extraen información de la base de datos. Consulta SQL: “selecciona” filas y columnas de una o más tablas en una base de datos. SELECT: las selecciones se llevan a cabo mediante consultas SELECT 23.4.1 Clausula WHERE Clausula WHERE: en la mayoría de los casos es necesario localizar, en una base de datos, filas que cumplan con ciertos criterios de selección (formalmente llamados predicados). Clausula WHERE: SQL utiliza la cláusula WHERE en una consulta SELECT para especificar los criterios de selección para la consulta. WHERE: Los criterios de la cláusula WHERE pueden contener los operadores <, >, <=, >=, =, <> y LIKE. LIKE: El operador LIKE se utiliza para relacionar patrones con los caracteres comodines porcentaje (%) y guión bajo (_). El relacionar patrones permite a SQL buscar cadenas que coincidan con un patrón dado. Un patrón que contenga un carácter de porcentaje (%) busca cadenas que tengan cero o más caracteres en la posición del carácter de porcentaje en el patrón.