Saltar a contenido

Estructura de una aplicación JavaFX

Estructura aplicación

JavaFX utiliza una metáfora del teatro, es decir una aplicación desarrollada con esta tecnología está compuesta por tres componentes esenciales los cuales son:

  1. Stage - Escenario.
  2. Scene - Escena.
  3. Nodes - Nodos.

Stage

El contenedor de nivel superior es el escenario (Stage) y lo construye y proporciona automáticamente la plataforma. En las aplicaciones de escritorio, el escenario es la ventana, en la cual agregaremos todos los objetos de nuestra interfaz gráfica; ésta actuará como contenedor principal, de forma similar a lo que hace en Java Swing la clase JFrame.

Stage

El escenario o Stage principal es creado por la plataforma en sí, y se pasa como argumento al método start() de la clase Application.

Para poder visualizar dicha ventana debemos hacer uso del método show() o showAndWait(). La diferencia entre los métodos show() y showAndWait(), es que show() hace visible el Stage y sale del método inmediatamente, mientras que showAndWait() muestra el objeto Stage y luego lo bloquea (permanece dentro del método showAndWait()) hasta que se cierre el Stage.

Una aplicación JavaFX puede tener múltiples objetos Stage. Cuando se crea un nuevo Stage se puede establecer su modalidad. La modalidad determina si la ventana que representa el Stage bloqueará otras ventanas abiertas por la misma aplicación.

  • Modality.APPLICATION_MODAL, bloqueará todas las demás ventanas abiertas por esta aplicación. No puede acceder a ninguna otra ventana hasta que se haya cerrado esta ventana.
  • Modality.WINDOW_MODAL el Stage creado bloqueará la ventana del Stage que "posee" (propietario) el Stage creado, pero solo eso. No todas las ventanas de la aplicación.
  • Modality.NONE el Stage no bloqueará ninguna otra ventana abierta en esta aplicación.

Scene

Para mostrar cualquier cosa en un escenario Stage se necesita una escena Scene. Una escena está representada por un objeto Scene dentro de una aplicación JavaFX.

Un Stage solo puede mostrar una escena a la vez, pero es posible intercambiar la escena en tiempo de ejecución. Al igual que un escenario en un teatro se puede reorganizar para mostrar varias escenas durante una obra, un objeto de escenario (Stage) en JavaFX puede mostrar varias escenas (una a la vez) durante la vida útil de una aplicación JavaFX.

Un ejemplo de aplicación con varios Scene para un Stage sería un juego de computador. Un juego puede tener múltiples "pantallas" para mostrar al usuario. Por ejemplo, una pantalla de menú inicial, la pantalla principal del juego (donde se juega el juego), una pantalla de finalización del juego y una pantalla de puntuación más alta. Cada una de estas pantallas puede ser representada por una escena diferente. Cuando el juego necesita cambiar de una pantalla a la siguiente, simplemente adjunta la escena correspondiente al objeto Stage de la aplicación JavaFX.

Cuando nos referimos a la escena, estamos haciendo referencia a los o contenidos físicos (nodos) de una aplicación JavaFX; la clase Scene perteneciente al paquete Javafx.scene proporciona todos los métodos para manejar un objeto de escena.

Scene

La escena consta de elementos como la raíz (Root Node), que es el elemento superior de la escena y contiene lo que se llama el gráfico de escena (Scene Graph). El gráfico de escena es una estructura estrictamente jerárquica de elementos que visualizan la aplicación. Estos elementos se denominan Nodos. Un nodo tiene exactamente un padre (excepto el nodo raíz) y puede contener otros nodos. O un nodo puede ser un nodo hoja sin hijos. Se deben agregar nodos al gráfico de escena para participar en la representación de esa escena. Además, un nodo puede agregarse solo una vez a una escena, a menos que primero se elimine y luego se agregue en otro lugar.

Al crear un objeto de tipo Scene, debemos pasar como argumento el nodo raíz el cual contendrá todos los nodos que se visualizarán en dicha interfaz e igualmente tenemos la posibilidad de asignar unas dimensiones (ancho y alto) a la escena.

import javafx.application.Application; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class HelloApplication extends Application { 

    @Override 
    public void start(Stage stage) { 
        Text texto = new Text("Hello World"); 
        StackPane nodoRaiz = new StackPane(texto); 
        Scene escena = new Scene(nodoRaiz, 300, 300); 
        stage.setScene(escena); stage.show(); 
    }
    public static void main(String[] args) { 
        launch();
    } 
}

Node

Constituyen el nivel más bajo del diagrama. Un nodo hace referencia a los componentes, los cuales pueden ser: etiquetas de texto (Labels), Botones (Buttons), Tablas (Tables), Contenedores (Containers).

La clase Node, javafx.scene.Node, es la clase base (superclase) para todos los componentes agregados a JavaFX Scene Graph. La clase Node es abstracta, por lo que solo agregará subclases de la clase Node al Scene Graph. Todas las instancias de Node en el escenario gráfico comparten un conjunto de propiedades comunes que están definidas por la clase JavaFX Node.

Conceptos básicos de JavaFX Node

Cada instancia de Node (subclase) solo se puede agregar al Scene Graph una vez. En otras palabras, cada instancia de Node solo puede aparecer en un lugar en el escenario gráfico. Si intenta agregar la misma instancia de Node, o instancia de subclase de Node, al gráfico de escena más de una vez, se generará una excepción. Un nodo JavaFX a veces puede tener subelementos, que también se denominan elementos secundarios. Una vez que se adjunta una instancia de node al gráfico de escena, solo el hilo de la aplicación JavaFX puede modificar la instancia de node.

Propiedades de JavaFX Node

La clase Node y todas las subclases de Node, tienen las siguientes propiedades:

  • Sistema de coordenadas (Coordinate System). Cada nodo JavaFX tiene su propio sistema de coordenadas cartesianas. La única diferencia con un sistema de coordenadas cartesianas regular es que el eje Y está invertido. Eso significa que el origen del sistema de coordenadas está en la esquina superior izquierda del sistema de coordenadas. A medida que aumentan los valores de Y, el punto se mueve hacia abajo desde la parte superior del sistema de coordenadas. Esta inversión del eje Y es normal en los sistemas de coordenadas de gráficos 2D. Es posible que un nodo JavaFX tenga coordenadas X e Y negativas.

    Cada nodo tiene su propio sistema de coordenadas. Este sistema de coordenadas se utiliza para colocar instancias de nodos secundarios dentro del nodo principal o al dibujar en un lienzo JavaFX. Eso significa que un nodo que es hijo de otro nodo tiene su propio sistema de coordenadas y una ubicación (X,Y) dentro del sistema de coordenadas de su nodo principal.

  • Items (Child nodes).Muchas subclases de nodos pueden contener elementos o nodos secundarios. La forma exacta en que agrega y accede a estos nodos secundarios depende de la subclase de nodo concreta. Algunas clases tienen un método getItems() que devuelve una lista de elementos. Otras clases tienen un método getChildren() que hace lo mismo. Se tendrá que comprobar la subclase de Nodo concreta para averiguar si puede tener elementos o nodos secundarios, y cómo los agrega y accede a ellos.