Hola, gracias por comentar.
Respecto a si cambia mucho con respecto a Swing es sí. La arquitectura es diferente, es más organizada, más flexible. Por ejemplo, con FX los EventHandler son muy flexibles, le puedes dar un determinado tipo de listener a tus controles que con Swing no sería posible. Puedes usar CSS para darle el estilo deseado a tus controles.
Otro punto es que, la forma en como se trabaja no es muy diferente a Swing. En Swing se hereda de JFrame para hacer una ventana, y con FX se hereda de Application. La lógica en realidad, no es muy diferente. La transición de Swing a FX no es muy dura.
Puedes crear una GUI con FX de 2 formas:
1) Manualmente (Por código Java)
2) Por medio de Scene Builder.
La ventana de hacerlo por Scene Builder es que tu puedes diseñar tu GUI simplemente arrastrando controles (como Visual Studio), pero la ventaja es que no te genera código Java, si no código FXML.
FXML es un lenguaje de etiquetado con el que podemos crear nuestras GUI's, no se mezcla en nada con código Java. De esta manera, se separa una clase Controladora y la vista (FXML).
Cuando creamos una GUI con SceneBuilder tenemos que especificar cuál es la clase
Controladora que manejará la GUI.
Primero, tienes que crear un proyecto JavaFX FXML Aplication o si quieres usar un paquete dentro de un proyecto ya existente, simplemente dale clic derecho -> Other -> JavaFX - Empty FXML.
Te creará un archivo FXML. Ábrelo así:
Luego ya puedes empezar a crear la GUI. En el apartado izquierdo, tendrás los Paneles y Controles. Para colocarlo en tu GUI simplemente arrástralos. En el apartado derecho verás una columna con 3 secciones:
- Properties: Aquí puedes editar las propiedades del control, como color de texto, tamaño y tipo de fuente, etc y además puedes agregar un archivo CSS.
- Layout: Aquí puedes modificar el tamaño, y cualquier cosa que tenga que ver con el layout.
- Code: Aquí especificas el identificador que tendrá el control en tu clase Controladora, y los distintos tipos de eventos que le quieras aplicar.
Aquí le digo al control qué metodo será el que desencadene los eventos:
Cuando termines de crear la GUI, tienes que especificar la clase Controladora en propiedades de AnchorPane:
Ejemplo Completo:
ControladoraVista:import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
/**
*
* @author mitsu
*/
public class ControladoraVista implements Initializable {
@FXML public void btnShowAction() {
lblShowMsg.setText(txtMsg.getText());
}
@Override
}
}
Como puedes ver, hay algunas anotaciones de tipo @FXML. Bien, esto lo que hace, es
asociar un control o evento con el archivo FXML. por lo que, de esta manera, podemos utilizar los controles que hemos diseñado previamente en la GUI con Scene Builder.
Un punto importante es éste método:
@FXML public void btnShowAction() {
lblShowMsg.setText(txtMsg.getText());
}
Lo que hace la antonación aquí es: Asociar el evento del botón con este método. Ya no es necesario utilizar EventHandler, si no, directamente se escribe un método simple, con lo que queremos que haga ese botón.
El método se utiliza por si quieres inicializar algo, como una tabla por ejemplo, una lista, etc:
@Override
}
Vista.fxml<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<AnchorPane id="AnchorPane" prefHeight="283.0" prefWidth="338.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="javase.javafx.demo.ControladoraVista">
<children>
<Pane layoutX="0.0" layoutY="0.0" prefHeight="283.0" prefWidth="338.0">
<children>
<Label layoutX="29.0" layoutY="50.0" text="Mensaje:" />
<TextField fx:id="txtMsg" layoutX="115.0" layoutY="47.0" prefWidth="178.0" />
<Button fx:id="btnShow" layoutX="138.0" layoutY="97.0" mnemonicParsing="false" onAction="#btnShowAction" text="Mostrar" />
<Label fx:id="lblShowMsg" layoutX="29.0" layoutY="163.0" prefHeight="42.1328125" prefWidth="277.0" text="" textFill="#00a3ff">
<font>
<Font size="16.0" />
</font>
</Label>
</children>
</Pane>
</children>
</AnchorPane>
Ésta parte es la que asocia la clase Controladora con la GUI:
fx:controller="javase.javafx.demo.ControladoraVista">
Aquí es donde especificamos el evento para el botón:
<Button fx:id="btnShow" layoutX="138.0" layoutY="97.0" mnemonicParsing="false" onAction="#btnShowAction" text="Mostrar" />
Clase principal:package javase.javafx.demo;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author mitsu
*/
public static void main
(String[] args
) { launch(args); // metodo encargado de lanzar la aplicacion
}
@Override
public void start(Stage stage) {
stage.setTitle("JavaFX Demo");
Parent root = null;
// carga el archivo FXML e inicializa la stage, scene y hace visible la stage
try {
root = FXMLLoader.load(getClass().getResource("/javase/javafx/demo/Vista.fxml"));
Scene scene = new Scene(root); // agrega el panel Group a la escena
stage.setScene(scene); // establece esta escena para la stage
stage.setResizable(false);
stage.show(); // equivalente a 'setVisible(true)
}
}
}
Notas:- El método start() es el que se encarga de crear la GUI. Es por ésto que aquí es donde cargamos el archivo .fxml.
- En el método main, tenemos el método launch() que es el encargado de levantar la aplicación.
Resultado: