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

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.