|
New 2 Java: Construir una Aplicación: 2.- Herencia, Paneles y Distribución |
Introducción
En Construir una Aplicación, Parte 1, aprendimos sobre los objetos de la aplicación, y que los planos para los objetos se escriben en ficheros llamados clases. Además, aprendimos a usar clases predefinidas de los APIs de Java, y a manipular objetos llamando a métodos.
Hata ahora, hemos construido la primera clase de la aplicación Dive Log y espacio para almacenar las clases que DiveLog.java inicializa.
La parte 2 refuerza estos conceptos y presenta la clase Welcome, que cubre
- Herencia
- Imágenes y objetos de texto
- Concatenación de cadenas de texto
- Controladores de distribución
Empezando
En la Parte 1, creamos la clase DiveLog, que contenía un constructor que creaba un marco para la aplicación Dive Log, un JMenu, e inicializaba un objeto JTabbedPane con seis pestañas con título. Cada pestaña creaba un objeto para una clase contenedor que, por ahora, no hace nada.
Para esta parte del tutorial, necesitamos imágenes y la clase Welcome.java. Podemos usar diferentes imágenes a las proporcionadas aquí, pero para evitar problemas con la distribución debemos asegurarnos de que tienen el mismo tamaño que las imágenes proporcionadas. A lo largo del trabajo del tutorial, descubriremos algunas formas más para personalizar nuestra aplicación y su distribución.
| Sigue estos pasos... |
|---|
|
Herencia
Las aplicaciones pueden consistir en una sóla clase, pero la mayoría se construyen con muchas clases. Las clases que componen una aplicación frecuentemente se comunican a través de referencias a un objeto y de métodos, usando el operador punto. Hemos visto ejemplos de esto en la clase DiveLog:
dlframe.setSize(765, 690);
En este ejemplo, dlframe es la referencia al ejemplar de un objeto JFrame que hemos creado, pero la clase JFrame no define ningún método llamado setSize. ¿De dónde viene este método? ¿Cómo podemos llamar a un método sobre un objeto JFrame, cuando la clase JFrame no define ese método? Este proceso funciona de forma similar a la forma en la que el color del pelo pasa de padres a hijos -- a través de la herencia. Pero la herencia de las clases Java le da al desarrollador mucho más control sobre el objeto hijo que la herencia de los humanos.
Como nosotros ejemplarizamos un objeto del tipo JFrame, la clase DiveLog heredó todos los métodos que contiene JFrame. Además, la clase DiveLog hereda métodos que JFrame heredó. La clase JFrame heredó métodos y campos de varias clases en su árbol de herencia:

Todas las clases descienden automáticamente de la clase Object. Además, cuando creamos un objeto del tipo JFrame, este objeto también desciende de las clases Frame, Window, Container, y Component. Para llamar a un método de una de estas clases heredadas, generalmente usamos el operador punto con la referencia de la variable. El método setSize fué heredado desde la clase Component.
No todos los métodos y campos heredados son accesibles, sólo son parte de la creacción de ese objeto. Después, aprenderemos más sobre el acceso a cirtos tipos de datos de las clases padre.
Hay una forma más directa de heredar desde una clase específica: usar la palabra clave extends en la declaración de la clase. Usando extends, nuestro hijo (también llamado subclase o clase derivada) desciende de la clase padre o superclase y nos libera de tener que:
- Ejemplarizar la clase heredada deseada para obtener sus métodos y campos.
- Llamar a un método desde la super clase con una referencia de variale y el operador punto
En otras palabras, la palabra clave extends permite a nuestra clase descender desde la clase que elijamos, al contrario que la herencia humana en la que no podemos elegir como son nuestros padres o que rasgos vamos a heredar de ellos.
Para hacer que la clase DiveLog sea un hijo de la clase JFrame, tecleamos:
public class DiveLog extends JFrame
Ahora hemos especificado una clase que queremos subclasificar, y se convierte en el tipo de la clase. Usando la sentencia de arriba, hacemos la clase DiveLog un tipo de objeto JFrame.
Extendiendo la clase JFrame, ya no hay necesidad de ejemplarizar JFrame en nuestra clase para obtener sus métodos, como se vió en la lección anterior:
dlframe.addWindowListener(new WindowAdapter() dlframe.getContentPane().add(tabbedPane); dlframe.setJMenuBar(mb);
En su lugar, podemos escribir la llamada a método sin la variable dlframe. Podemos llamar a los métodos herdados por sus nombres:
getContentPane().add(tabbedPane); addWindowListener(new WindowAdapter() getContentPane().add(tabbedPane); setJMenuBar(mb);
La clase padre, JFrame, tiene un constuctor que podemos llamar usando la palabra clave super. DiveLog puede llamar al constructor de JFrame y suministrarle el String que aparezca en la parte superior de la ventana del marco, de esta forma:
super("A Java(TM) Technology Dive Log");
En la herencia humana, nosotros obtenemos algunos genes de nuestra madre y otros de nuestro pade. Con la herencia de clases, usando la palabra clave extends, el objeto DiveLog es un objeto JFrame con las características adicionales que nosotros le hemos añadido. En otras palabras, el objeto DiveLog tiene todo lo que un objeto JFrame y más. Además de tener un marco con un título, el objeto DiveLog, derivado desde el objeto JFrame tiene:
- un objeto TabbedPane
- pestañas y título
- memoria reservada para contener otras clases donde crearemos más objetos.
Para mejorar esta clase, podemos mover los métodos setSize(765, 690), setBackground(Color.white), y setVisible(true) dentro del método main. Como DiveLog es un objeto del tipo frame, tiene sentido seleccionar su tamaño y si color de fondo en el objeto DiveLog recientemente ejemplarizado una vez construido, en vez de cuando está siendo construido. Pero funciona de ambas formas.
No necesitamos reescribir nuestro DiveLog.java para continuar con este tutorial, pero es un buen ejercicio sobre la herencia.
| Sigue estos pasos... |
|---|
Nota:
|
La siguiente clase Dive Log extends una clase para obtener beneficios de la herencia. La clase Welcome contiene el contenido de la primera pestaña de la aplicación Dive Log.
| ¿Qué clase debería extender Welcome? |
|---|















































