JavaFX

Resumo

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

Observação!

Para usar um "Pane JavaFX" dentro do Swing -> JFXPanel

Para usar um "Pane Swing" dentro do JavaFX -> SwingNode

Não vou quebrar a minha cabeça com JFXPane e SwingNode. Vou só estudar o JavaFX e só! Criem vocês um Framework que manipule os dois, tanto o Swing quanto JavaFX dentro do mesmo projeto.

Um simples botão

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();
    }

}

Botão com ícone e caixa de diálogo

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();
    }

}

TextField

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();
    }

}

Label

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();
    }

}

TextArea

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();
    }

}

ComboBox

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();
    }

}

ListView

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();
    }

}

CheckBox

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();
    }

}

RadioButton

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();
    }

}

ImageView

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();
    }

}