Fenêtres internes (Internal Frame) - JavaFX et Swing JDesktopPane

Maven javafx-swing

<dependencies>
   <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>19</version>
   </dependency>
   <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-swing</artifactId>
      <version>19</version>
   </dependency>
</dependencies>

JavaFX Swing DesktopPane

import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * JavaFX App
 */
public class App extends Application {

  public static void main(String[] args) {
    launch();
  }

  @Override
  public void start(Stage stage) {

    // Le noeud pour afficher des contenus swing
    var swingNode = new SwingNode();

    // FIXME
    // HACK : Le timer pour rafraichir le contenu Swing
    new Timer().schedule(new TimerTask() {
      public void run() {
        SwingUtilities.invokeLater(() -> {
          var content = swingNode.getContent();
          if (content != null) {
            content.repaint();
          }
        });
      }
    }, 500);

    // Thread Swing
    SwingUtilities.invokeLater(() -> {

      // Le panneau pour afficher les fenêtres internes
      var desktop = new JDesktopPane();

      // La fenêtre interne
      var internalFrame = new JInternalFrame();
      internalFrame.setSize(400, 200);
      internalFrame.setVisible(true);

      // Ajoute la fenêtre
      desktop.add(internalFrame);

      // Le panneau JFX pour des contenus JavaFX dans Swing
      var jfxPanel = new JFXPanel();
      internalFrame.add(jfxPanel);

      // Thread JavaFX
      Platform.runLater(() -> {
        var label = new Label("Label JavaFX");
        var button = new Button("Test");
        var scene = new Scene(new VBox(label, button), 400, 200);
        jfxPanel.setScene(scene);
      });

      swingNode.setContent(desktop);
    });

    var scene = new Scene(new StackPane(swingNode), 640, 480);
    stage.setScene(scene);

    // Termine le programme quand la fenêtre est fermée
    stage.setOnCloseRequest(event -> {
      System.exit(0);
    });

    stage.show();
  }

}

Commentaires