New 2 Java: Construir una Aplicación: 2.- Herencia, Paneles y Distribució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...
  1. Graba las siguientes im�genes en el directorio divelog/images:
  2. O crea t� las im�gnes, pero usando los mismos tama�os que las listadas arriba

.�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...
  1. Abrimos DiveLog.java en nuestro editor.
  2. Cambiamos la definici�n de la clase de
    public class DiveLog
    
    a:
    public class DiveLog extends JFrame
    
  3. Borramos la declaraci�n de variable : private JFrame dlframe;
  4. Cambiamos el viejo constructor de JFrame:
    JFrame dlframe = 
       new JFrame("A Java(TM) Technology Dive Log");
    
    a:
    super("A Java(TM) Technology Dive Log");
    
  5. Eliminamos dlframe. de los m�todos.
  6. Despu�s de inicializar un objeto DiveLog en main, usamos la variable dl para llamar a los m�todos setSize(765, 690), setBackground(Color.white), y setVisible(true). Por ejemplo:
    dl.setSize(765, 690);
    
  7. Grabamos el fichero.
  8. Compilamos la clase DiveLog.java con:
    Sobre Wwindows:
    C:\divelog>javac -classpath C:\ DiveLog.java 
    
    Sobre Solaris:
    divelog% javac -classpath /home/usr/ DiveLog.java
    

Nota:
Debemos estar en el directorio divelog mientras ejecutamos este comando. Debemos asegurarnos de que hay une espacio entre el �ltimo \ o / antes de DiveLog.java.

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?
   JFrame
   JPanel
   Ninguna

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR