HOWTO · Java

El método setOnAction en JavaFX

Aprende cómo manejar una acción de un botón de JavaFX y actualizar una etiqueta con setOnAction().

En esta página

En JavaFX, llama a setOnAction() en un control para registrar qué debe suceder cuando un usuario lo activa. Un controlador de botón puede actualizar una etiqueta, validar los valores de un formulario o iniciar otra acción de la interfaz de usuario. Por ejemplo, crea un Label llamado status y un Button llamado button, y luego adjunta button.setOnAction(event -> status.setText("Button clicked"));. Cuando el usuario activa el botón, la etiqueta cambia.

Use el método setOnAction() en JavaFX

setOnAction() acepta un controlador de eventos. Una lambda es una forma concisa de proporcionarlo: button.setOnAction(event -> status.setText("Button clicked"));. El botón y la etiqueta deben ser controles de JavaFX en la escena de la aplicación. El controlador se ejecuta cuando se hace clic en el botón o se activa de otro modo mediante su acción de control normal; no es un listener para una tecla arbitraria del teclado.

Coloca ambos controles en el grafo de escena de la aplicación, como un HBox, y luego muestra esa escena en un Stage. Una aplicación JavaFX completa también necesita una clase que extienda Application, un método start(Stage stage) y un método main que llame a launch(args). El entorno de ejecución de Java configurado para este artículo no incluye JavaFX, por lo que estas llamadas a la API específicas de JavaFX se describen, pero no se presentan como un programa ejecutado. Para ejecutarlas en tu proyecto, haz que los módulos de controles y gráficos de JavaFX estén disponibles y configura los ajustes de lanzamiento para incluir el SDK o las dependencias de JavaFX.

Ejecuta este ejemplo:

public class ActionHandlerDemo {
    static class Button {
        private Runnable handler;

        void setOnAction(Runnable handler) {
            this.handler = handler;
        }

        void click() {
            handler.run();
        }
    }

    public static void main(String[] args) {
        String[] label = {"Button not clicked"};
        Button button = new Button();
        button.setOnAction(() -> label[0] = "Button clicked");
        button.click();
        System.out.println(label[0]);
    }
}
Button clicked

La salida de la consola es el valor después de que el método click() del modelo invoca el callback. En una aplicación JavaFX, hacer clic o activar normalmente el botón real llama en su lugar a status.setText("Button clicked"), y el texto actualizado aparece en la ventana.

Ampliar la funcionalidad con setOnAction()

El mismo controlador puede actualizar varios controles o validar la entrada. Mantén la acción enfocada; para un trabajo más largo, llama a un método que sea dueño de la operación y luego actualiza la interfaz con su resultado.

Por ejemplo, un botón de envío puede comprobar un campo de texto y mostrar comentarios en una etiqueta: submitButton.setOnAction(event -> { if (nameField.getText().isBlank()) { status.setText("Enter a name"); } else { status.setText("Ready to submit"); } });. Los identificadores se refieren a controles creados en otra parte de la aplicación JavaFX. isBlank() está disponible en Java 11 y versiones posteriores; para una versión anterior de Java, usa una comprobación de cadena recortada como nameField.getText().trim().isEmpty().

Para la navegación, una acción puede seleccionar una escena que la aplicación ya ha preparado, por ejemplo stage.setScene(nextScene). Guardar un archivo o llamar a un servicio también puede comenzar desde una acción de botón, pero esas operaciones necesitan su propio manejo de errores y deben evitar bloquear el hilo de la aplicación JavaFX durante el trabajo lento.

Conclusión

Usa setOnAction() para conectar la acción de un control de JavaFX con un controlador. Para un botón, ese controlador responde a un clic o a una activación normal con el teclado y puede actualizar una etiqueta o realizar otra tarea. El modelo de consola ilustra el flujo del callback; no crea una ventana de JavaFX. Si tu proyecto aún no incluye JavaFX, configura las bibliotecas y los ajustes de lanzamiento necesarios para tu herramienta de compilación o IDE antes de ejecutar la GUI.