Professional Documents
Culture Documents
Una escena contiene un gráfico de escena que consiste en nodos visuales. En este
sentido, una escena actúa como un contenedor para un gráfico de escena. Un gráfico
de escena es una estructura de datos de árbol cuyos elementos se conocen como
nodos. Los nodos en un gráfico de escena forman una relación jerárquica padre-hijo.
Un nodo en un gráfico de escena es una instancia de la clase javafx.scene.Node. Un
nodo puede ser un nodo de rama o un nodo de hoja. Un nodo de rama puede tener
nodos secundarios, mientras que un nodo hoja no puede. El primer nodo en un gráfico
de escena se llama nodo raíz. El nodo raíz puede tener nodos secundarios; sin
embargo, nunca tiene un nodo padre. La Figura 5-1 muestra la disposición de los nodos
en un gráfico de escena. Los nodos de rama se muestran en rectángulos redondeados
y nodos de hoja en rectángulos.
Una escena siempre tiene un nodo raíz. Si el nodo raíz es redimensionable, por
ejemplo, una Región o un Control, rastrea el tamaño de la escena. Es decir, si la escena
cambia de tamaño, el nodo raíz redimensionable se redimensiona para llenar toda la
escena. En función de la política de un nodo raíz, el gráfico de escena puede
establecerse nuevamente cuando cambia el tamaño de la escena.
Un grupo es un nodo primario no reajustable que se puede configurar como nodo raíz
de una escena. Si un grupo es el nodo raíz de una escena, el contenido del gráfico de
escena queda recortado por el tamaño de la escena. Si la escena cambia de tamaño, el
gráfico de escena no se replantea.
El padre es una clase abstracta. Es la clase base para todos los nodos de la rama en un
gráfico de escena. Si desea agregar un nodo de bifurcación a un gráfico de escena, use
objetos de una de sus subclases concretas, por ejemplo, Grupo, Panel, HBox o VBox.
Las clases que son subclases de la clase Node, pero no de la clase Parent, representan
nodos hoja, por ejemplo, Rectangle, Circle, Text, Canvas o ImageView. El nodo raíz de
un gráfico de escena es un nodo de rama especial que es el nodo superior. Esta es la
razón por la que utiliza un Group o un VBox como nodo raíz al crear un objeto Scene.
Discutiré las clases que representan nodos de ramas y hojas en detalle en los Capítulos
10 y 12. La Tabla 5-1 enumera algunas de las propiedades comúnmente utilizadas de la
clase Escena.
Modos de representación gráfica
El gráfico de escena juega un papel vital al mostrar el contenido de una aplicación
JavaFX en la pantalla. Normalmente, dos tipos de API se utilizan para representar
gráficos en una pantalla:
Podría pensar que el uso de la API de modo inmediato siempre sería más rápido que
usar la API de modo retenido porque la primera representa los gráficos directamente
en la pantalla. Sin embargo, el uso de la API de modo retenido abre la puerta a
optimizaciones por parte de la biblioteca de clases que no es posible en el modo
inmediato en el que cada desarrollador se encarga de escribir la lógica sobre qué y
cuándo debe representarse.
Las Figuras 5-3 y 5-4 ilustran cómo funcionan las API de modo inmediato y retenido,
respectivamente. Muestran cómo se dibujan un texto, un saludo y un hexágono en la
pantalla usando las dos API.
Escena de escena;
...
scene.setCursor ( Cursor.WAIT);
También puede crear y establecer un cursor personalizado para una escena. El método
estático del cursor ( nombre de cadena) de la clase Cursor devuelve un cursor estándar
si el nombre especificado es el nombre de un cursor estándar. De lo contrario, trata el
nombre especificado como una URL para el mapa de bits del cursor. El siguiente
fragmento de código crea un cursor desde un archivo de mapa de bits llamado
mycur.png, que se supone que está en el CLASSPATH:
Las clases de generador están diseñadas para usar el método de encadenamiento. Sus
métodos para configurar propiedades devuelven la misma instancia de generador.
Suponiendo que p1 y p2 son propiedades de un objeto de tipo XXX, la siguiente
instrucción usa la clase de constructor para crear un objeto de tipo XXX. Establece las
propiedades p1 y p2 en v1 y v2, respectivamente:
El uso de clases de compilador requiere un código más largo; sin embargo, es más
legible en comparación con el uso de constructores para establecer las propiedades.
Otra ventaja de las clases de compilador es que pueden reutilizarse para construir
objetos con propiedades ligeramente diferentes. Supongamos que desea crear
múltiples rectángulos con un ancho de 100 píxeles y una altura de 200 píxeles, rellenos
con el color rojo. Sin embargo, tienen diferentes coordenadas xey. Puedes hacerlo con
el siguiente código:
Si utilizó el script JavaFX, que se eliminó de JavaFX versión 2.0, puede inclinarse a
utilizar clases de compilador para compilar escenas. Si ha estado utilizando Swing /
AWT, puede sentirse cómodo usando constructores y setters en su lugar. Los ejemplos
en este libro no usan clases de constructor.
El método runLater ( ) se utiliza para enviar una tarea ejecutable a una cola de eventos,
por lo que se ejecuta en el subproceso de la aplicación JavaFX. JavaFX permite a los
desarrolladores ejecutar algunos de los códigos solo en el subproceso de la aplicación
JavaFX. El listado 5-2 crea una tarea en el método init ( ) que se invoca en el
subproceso iniciador JavaFX. Utiliza el método Platform.runLater ( ) para enviar la
tarea que se ejecutará en el subproceso de la aplicación JavaFX más adelante.
Consejo: utilice el método Platform.runLater ( ) para ejecutar una tarea que se crea en
un hilo que no sea el hilo de la aplicación JavaFX, pero que necesita ejecutarse en el
hilo de la aplicación JavaFX.
Algunas funciones en una implementación JavaFX son opcionales (o condicionales). Es
posible que no estén disponibles en todas las plataformas. El uso de una función
opcional en una plataforma que no admite la función no genera un error; la
característica opcional simplemente se ignora. Las características opcionales se definen
como constantes enum en la enumeración ConditionalFeature en el paquete
javafx.application, como se enumera en la Tabla 5-3.
Cadena getCodeBase ()
Cadena getDocumentBase ()
JSObject getWebContext ()
String resolveURI (String base, String relativeURI)
void showDocument (String uri)
El método resolveURI ( ) resuelve el URI relativo especificado con respecto al URI base
especificado y devuelve el URI resuelto.
El programa en el listado 5-3 usa todos los métodos de la clase HostServices. Muestra
un escenario con dos botones y detalles de host. Un botón abre el Yahoo! página de
inicio y otra muestra un cuadro de alerta. La salida que se muestra en el escenario
variará según cómo se inicie la aplicación.
Resumen
Una escena representa el contenido visual de un escenario. La clase Scene en el
paquete javafx.scene representa una escena en un programa JavaFX. Un objeto de
Escena se adjunta a más de una etapa a la vez. Si una escena ya adjunta se adjunta a
otra etapa, primero se separa de la etapa anterior. Una etapa puede tener como
máximo una escena asociada a ella en cualquier momento.
Una escena contiene un gráfico de escena que consiste en nodos visuales. En este
sentido, una escena actúa como un contenedor para un gráfico de escena. Un gráfico
de escena es una estructura de datos de árbol cuyos elementos se conocen como
nodos. Los nodos en un gráfico de escena forman una relación jerárquica padre-hijo.
Un nodo en un gráfico de escena es una instancia de la clase javafx.scene.Node. Un
nodo puede ser un nodo de rama o un nodo de hoja. Un nodo de rama puede tener
nodos secundarios, mientras que un nodo hoja no puede. El primer nodo en un gráfico
de escena se llama nodo raíz. El nodo raíz puede tener nodos secundarios; sin
embargo, nunca tiene un nodo padre.
Solo un nodo en una escena puede ser el propietario del foco. La propiedad
focusOwner de solo lectura de la clase Scene rastrea el nodo que tiene el foco. Si desea
que un nodo específico de una escena sea el propietario del foco, debe llamar al
método requestFocus ( ) de la clase Node. Cada escena puede tener un propietario de
foco. Por ejemplo, si abre dos ventanas, tendrá dos escenas y puede tener dos
propietarios de foco. Sin embargo, solo uno de los dos propietarios de foco puede
enfocarse a la vez. El foco propietario de la ventana activa tendrá el foco. Para verificar
si el nodo propietario del foco también tiene el foco, debe usar la propiedad enfocada
de la clase Node.