¡Excelente elección! JavaFX es un framework potente para construir interfaces de usuario de escritorio en Java, ofreciendo una experiencia moderna y rica. Aquí tienes un “cheatsheet” completo y bien estructurado de JavaFX, optimizado para ser claro y conciso para una IA conversacional.


🎨 JavaFX Cheatsheet Completo 🎨

JavaFX es un kit de herramientas de GUI de código abierto y multiplataforma para Java. Permite desarrollar aplicaciones de escritorio ricas y expresivas con gráficos, multimedia y una API Java moderna. Es el sucesor natural de Swing y AWT para el desarrollo de GUI en Java.


1. 🌟 Conceptos Clave


2. 🛠️ Configuración Inicial (Proyecto Maven)

Para Java 11+, JavaFX se gestiona como módulos externos.

  1. Añade las dependencias en pom.xml:

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>22</version> &lt;!-- Usar la versión más reciente -->
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>22</version>
        </dependency>
        &lt;!-- Puedes añadir más módulos según necesites: javafx-graphics, javafx-media, etc. -->
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>21</source> &lt;!-- Tu versión de Java -->
                    <target>21</target>
                </configuration>
            </plugin>
            &lt;!-- Plugin para ejecutar y empaquetar la aplicación JavaFX -->
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <configuration>
                    <mainClass>com.example.myapp.HelloApplication</mainClass> &lt;!-- Tu clase principal -->
                </configuration>
            </plugin>
        </plugins>
    </build>
  2. Configura module-info.java (si usas módulos Java):

    // src/main/java/module-info.java
    module com.example.myapp {
        requires javafx.controls;
        requires javafx.fxml;
        // requires javafx.graphics; // Si usas javafx.graphics
        // requires javafx.media;    // Si usas javafx.media
    
        opens com.example.myapp to javafx.fxml; // Permite que FXML acceda a tu paquete
        exports com.example.myapp; // Exporta tu paquete principal
    }

3. 🖥️ Estructura Básica de la Aplicación

Toda aplicación JavaFX principal debe extender javafx.application.Application e implementar el método start().

// src/main/java/com/example/myapp/HelloApplication.java
package com.example.myapp;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane; // Un layout simple para centrar
import javafx.stage.Stage;

public class HelloApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        // 1. Crear el Root Node (un Layout)
        StackPane root = new StackPane();

        // 2. Crear un Node (un control)
        Label helloLabel = new Label("¡Hola, JavaFX!");

        // 3. Añadir el Node al Root Node
        root.getChildren().add(helloLabel);

        // 4. Crear la Scene (escena)
        Scene scene = new Scene(root, 400, 300); // root node, ancho, alto

        // 5. Configurar el Stage (ventana)
        primaryStage.setTitle("Mi Primera Aplicación JavaFX");
        primaryStage.setScene(scene); // Asignar la escena al escenario
        primaryStage.show(); // Mostrar el escenario
    }

    public static void main(String[] args) {
        launch(); // Método para lanzar la aplicación JavaFX
    }
}

4. 📐 Layouts (Contenedores)

Los layouts son nodos que organizan y posicionan a sus hijos.

// Ejemplo con VBox
VBox root = new VBox(10); // Espaciado de 10px
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(20)); // Padding alrededor
root.getChildren().addAll(new Button("Botón 1"), new Button("Botón 2"));

5. 🎛️ Controles Comunes (Widgets)

Los controles son nodos interactivos con los que el usuario puede interactuar.

// Ejemplo de botón y TextField
Button submitButton = new Button("Enviar");
TextField nameField = new TextField();
nameField.setPromptText("Ingrese su nombre"); // Texto placeholder

submitButton.setOnAction(event -&gt; {
    String name = nameField.getText();
    System.out.println("Nombre ingresado: " + name);
});

6. 🎨 Estilización (CSS)

JavaFX permite estilizar los nodos utilizando CSS.


7. ⚛️ FXML (Lenguaje de Marcado XML)

Separa la definición de la interfaz de usuario de la lógica de la aplicación.

  1. Archivo FXML (hello-view.fxml):

    &lt;!-- src/main/resources/com/example/myapp/hello-view.fxml -->
    &lt;?xml version="1.0" encoding="UTF-8"?>
    
    &lt;?import javafx.scene.control.Button?>
    &lt;?import javafx.scene.control.Label?>
    &lt;?import javafx.scene.layout.VBox?>
    
    <VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/22" fx:controller="com.example.myapp.HelloController">
        <children>
            <Label fx:id="welcomeText"/> &lt;!-- fx:id para inyectar en el controlador -->
            <Button text="Hello!" onAction="#onHelloButtonClick"/> &lt;!-- onAction para el método del controlador -->
        </children>
    </VBox>
  2. Controlador FXML (HelloController.java):

    // src/main/java/com/example/myapp/HelloController.java
    package com.example.myapp;
    
    import javafx.fxml.FXML;
    import javafx.scene.control.Label;
    
    public class HelloController {
        @FXML // Inyecta el Label del FXML
        private Label welcomeText;
    
        @FXML // Método llamado por onAction del Button
        protected void onHelloButtonClick() {
            welcomeText.setText("¡Bienvenido a JavaFX con FXML!");
        }
    
        // Método de inicialización (opcional, se llama después de que los elementos FXML son inyectados)
        public void initialize() {
            welcomeText.setText("Haga clic en el botón.");
        }
    }
  3. Cargador FXML en Application:

    // Modificación de HelloApplication.java para usar FXML
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent; // Para el root node cargado desde FXML
    
    // ... (imports existentes)
    
    @Override
    public void start(Stage primaryStage) throws Exception { // Importante: throws Exception
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("hello-view.fxml"));
        Parent root = fxmlLoader.load(); // Carga el FXML y construye el Scene Graph
    
        Scene scene = new Scene(root, 320, 240); // Usa el root cargado
        primaryStage.setTitle("Aplicación FXML");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

8. 🔄 Data Binding (Vinculación de Datos)

JavaFX tiene un sistema de propiedades robusto para el binding.

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
// ... (resto de imports)

public class BindingExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        StringProperty name = new SimpleStringProperty("John Doe"); // Un modelo de datos simple

        Label nameLabel = new Label();
        TextField nameField = new TextField();

        // Binding unidireccional: Label se actualiza cuando 'name' cambia
        nameLabel.textProperty().bind(name);

        // Binding bidireccional: TextField y 'name' se mantienen sincronizados
        nameField.textProperty().bindBidirectional(name);

        VBox root = new VBox(10);
        root.getChildren().addAll(nameLabel, nameField);

        Scene scene = new Scene(root, 300, 200);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Ejemplo de Binding");
        primaryStage.show();

        // Puedes cambiar 'name' programáticamente y la UI se actualizará
        name.set("Jane Smith"); // nameLabel y nameField se actualizan automáticamente
    }
    // ... main method
}

9. ⚡ Event Handling (Manejo de Eventos)

Button myButton = new Button("Clickeame");
myButton.setOnAction(event -&gt; {
    System.out.println("Botón clickeado!");
    event.consume(); // Consumir el evento para que no se propague a los padres
});

// Evento de teclado en un Scene
scene.setOnKeyPressed(event -&gt; {
    System.out.println("Tecla presionada: " + event.getCode());
    if (event.getCode() == KeyCode.ESCAPE) {
        System.out.println("Escape presionado. Saliendo...");
        Platform.exit();
    }
});

10. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa y concisa de JavaFX, cubriendo los fundamentos y las características esenciales para construir aplicaciones de escritorio ricas y eficientes en Java.