Swing é mais antigo, vem junto com o JDK.
JavaFX é "mais moderno", e após o Java 9 não vem mais com o JDK, é um "módulo separado".
** até Java 8 vinha com o JDK.
JavaFX também permite desenhar a tela com XML (extenção fxml na verdade, pode ser utilizado com JavaFX Scene Builder por exemplo).
E tem um "pseudo CSS", se vc conhece de CSS fica mais fácil customizar o layout com dessa forma.
Ex.
CSS -> background-color: black
JavaFX -> fx-background-color: black

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // Botão Button botao = new Button(); botao.setText("Olá mundo!"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(30); // topo // Tamanho botao.setPrefWidth(120); botao.setPrefHeight(40); // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { System.out.println("Hello World!"); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.image.Image; import java.util.Objects; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // Carrega o ícone a partir do caminho do seu projeto // onde vc esta salvando a imagem? como vc esta usando maven tem que salvar na pasta src/main/ressources // veja se sua imagem esta aqui src/main/resources/images/app-icon.png Image icone = new Image( Objects.requireNonNull( getClass().getResourceAsStream("/images/app-icon.png"), "Ícone não encontrado em /images/app-icon.png" ) ); // Adiciona o ícone à lista de ícones da janela/barra de tarefas primaryStage.getIcons().add(icone); // Botão Button botao = new Button(); botao.setText("Olá mundo!"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(30); // topo // Tamanho botao.setPrefWidth(120); botao.setPrefHeight(40); // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Título da caixa de diálogo"); alert.setHeaderText("Caixa de diálogo informa!"); alert.setContentText("Texto\nda\ncaixa\nde\ndiálogo"); alert.showAndWait(); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.TextField; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // Create an empty text field TextField textField = new TextField(); // Overwrite the content programmatically textField.setText("New value"); // Posição (equivale a esquerda/topo) textField.setLayoutX(50); // esquerda textField.setLayoutY(30); // topo // Adicionar elementos em cena raiz.getChildren().add(textField); // Botão Button botao = new Button(); botao.setText("Resultado"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(80); // topo // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Caixa de diálogo"); alert.setHeaderText("Caixa de diálogo informa!"); alert.setContentText(textField.getText()); alert.showAndWait(); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.scene.control.Label; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // Create a label with text Label simpleLabel = new Label(); // Modify text dynamicallUpdated y simpleLabel.setText("Updated Text"); // Posição (equivale a esquerda/topo) simpleLabel.setLayoutX(50); // esquerda simpleLabel.setLayoutY(30); // topo // Adicionar elementos em cena raiz.getChildren().add(simpleLabel); // Botão Button botao = new Button(); botao.setText("Resultado"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(80); // topo // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { if("Updated Text".equals(simpleLabel.getText())) simpleLabel.setText("Novo texto"); else if("Novo texto".equals(simpleLabel.getText())) simpleLabel.setText("Updated Text"); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.TextArea; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // Create a label with text TextArea textArea = new TextArea(); // Modify text dynamicallUpdated y textArea.setText("Welcome \nto \nJavaFX!"); // Define look and layout bounds textArea.setPrefRowCount(5); // Sets visual height based on text lines textArea.setPrefColumnCount(15); // Sets visual width based on character count // Posição (equivale a esquerda/topo) textArea.setLayoutX(50); // esquerda textArea.setLayoutY(30); // topo // Adicionar elementos em cena raiz.getChildren().add(textArea); // Botão Button botao = new Button(); botao.setText("Resultado"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(140); // topo // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Caixa de diálogo"); alert.setHeaderText("Caixa de diálogo informa!"); alert.setContentText(textArea.getText()); alert.showAndWait(); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ComboBox; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // Example: Creating a ComboBox with items ObservableList<String> options = FXCollections.observableArrayList("Java", "Python", "C++"); ComboBox<String> comboBox = new ComboBox<>(options); comboBox.setValue("Java"); // Set default selection comboBox.setEditable(true); // Posição (equivale a esquerda/topo) comboBox.setLayoutX(50); // esquerda comboBox.setLayoutY(30); // topo // Adicionar elementos em cena raiz.getChildren().add(comboBox); // Botão Button botao = new Button(); botao.setText("Resultado"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(140); // topo // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Caixa de diálogo"); alert.setHeaderText("Caixa de diálogo informa!"); alert.setContentText(comboBox.getValue()); alert.showAndWait(); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ListView; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // 1. Create the data list (Equivalent to DefaultListModel) ObservableList<String> items = FXCollections.observableArrayList( "Item One", "Item Two", "Item Three", "Item Four" ); // 2. Create the ListView and pass the data (Equivalent to JList) ListView<String> listView = new ListView<>(items); listView.setPrefWidth(120); listView.setPrefHeight(130); // Posição (equivale a esquerda/topo) listView.setLayoutX(50); // esquerda listView.setLayoutY(10); // topo // Adicionar elementos em cena raiz.getChildren().add(listView); // Botão Button botao = new Button(); botao.setText("Resultado"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(140); // topo // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Caixa de diálogo"); alert.setHeaderText("Caixa de diálogo informa!"); alert.setContentText(listView.getSelectionModel().getSelectedItem()); alert.showAndWait(); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.CheckBox; /** * JavaFX App */ public class App extends Application { private static String checkx; public App() { this.checkx = ""; } @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // 1. Create the CheckBox with a label CheckBox checkBox = new CheckBox(); checkBox.setText("Enable Premium Features"); // 2. Set initial selection state (Optional) checkBox.setSelected(true); // Posição (equivale a esquerda/topo) checkBox.setLayoutX(50); // esquerda checkBox.setLayoutY(10); // topo // Adicionar elementos em cena raiz.getChildren().add(checkBox); // Botão Button botao = new Button(); botao.setText("Resultado"); // Posição (equivale a esquerda/topo) botao.setLayoutX(50); // esquerda botao.setLayoutY(140); // topo // Manipula evento de ação no nó botão botao.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> { if (checkBox.isSelected()) { App.checkx = "Checkbox is checked!"; } else { App.checkx = "Checkbox is unchecked!"; } Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Caixa de diálogo"); alert.setHeaderText("Caixa de diálogo informa!"); alert.setContentText(App.checkx); alert.showAndWait(); }); // Adicionar elementos em cena raiz.getChildren().add(botao); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.application.Application; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.geometry.Insets; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.VBox; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) { // 1. Create a Label to display the selected choice Label statusLabel = new Label("Select your preferred language"); // 2. Instantiate the RadioButtons RadioButton rbJava = new RadioButton("Java"); RadioButton rbPython = new RadioButton("Python"); RadioButton rbCpp = new RadioButton("C++"); // 3. Create a ToggleGroup and assign the buttons to it ToggleGroup languageGroup = new ToggleGroup(); rbJava.setToggleGroup(languageGroup); rbPython.setToggleGroup(languageGroup); rbCpp.setToggleGroup(languageGroup); // 4. Set an initial selection (Optional) rbJava.setSelected(true); // 5. Add a listener to handle selection changes languageGroup.selectedToggleProperty().addListener((observable, oldToggle, newToggle) -> { if (newToggle != null) { // Cast the Toggle to a RadioButton to extract its text RadioButton selectedRadio = (RadioButton) newToggle; statusLabel.setText("Selected: " + selectedRadio.getText()); } }); // 6. Layout configuration VBox root = new VBox(10, statusLabel, rbJava, rbPython, rbCpp); root.setPadding(new Insets(20)); // 7. Scene and Stage setup Scene scene = new Scene(root, 300, 200); primaryStage.setTitle("JavaFX RadioButton Example"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(); } } |

| Arquivo: App.java |
| package minhaappjavafx.MinhaAppJavaFX; import javafx.application.Application; import javafx.scene.layout.Pane; import javafx.scene.Scene; import javafx.stage.Stage; import static javafx.application.Application.launch; import javafx.scene.image.Image; import javafx.scene.image.ImageView; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { // Layout livre (permite posicionamento manual) Pane raiz = new Pane(); // Cena Scene minhaCena = new Scene(raiz, 300, 200); // Barra de título primaryStage.setTitle("Hello World"); // 1. Load the image from your resources folder // Carrega o ícone a partir do caminho do seu projeto // onde vc esta salvando a imagem? como vc esta usando maven tem que salvar na pasta src/main/ressources // veja se sua imagem esta aqui src/main/resources/images/app-icon.png Image image = new Image(getClass().getResourceAsStream("/images/app-icon.png")); // 2. Wrap it inside an ImageView to display it in your UI ImageView imageView = new ImageView(image); // Optional: Resize the icon to fit your UI element imageView.setFitWidth(image.getWidth()); imageView.setFitHeight(image.getHeight()); // Adicionar elementos em cena raiz.getChildren().add(imageView); // Adicionar a cena ao palco primaryStage.setScene(minhaCena); // Exibir o palco e sua(s) cena(s) primaryStage.show(); } public static void main(String[] args) { launch(); } } |