java - 如何将 Swing JPanel 嵌入到 JavaFX 框架中?

标签 java swing javafx

来自 Integrating JavaFX 2.0 with Swing and SWT有一个代码允许您在 Swing JFrame 中嵌入 JFXPanel。我想知道是否有相反的情况,其中 JPanel 嵌入在 Application 中或 Stage这相当于 JFrameConverting from Swing to JavaFX? 中所述

/**
 * Simple class demonstrating interoperability between Swing and JavaFX. This
 * class is adapted from the example provided in the Javadoc documentation for
 * {@code javafx.embed.swing.JFXPanel}.
 */
public class SwingJavaFxInteroperabilityDemo
{
   private static void initAndShowGUI()
   {
      // This method is invoked on Swing thread
      final JFrame frame = new JFrame("JavaFX / Swing Integrated");
      final JFXPanel fxPanel = new JFXPanel();
      frame.add(fxPanel);
      frame.setVisible(true);

      Platform.runLater(new Runnable()
      {
         @Override
         public void run()
         {
            initFX(fxPanel);
         }
      });
   }

   private static void initFX(JFXPanel fxPanel)
   {
      // This method is invoked on JavaFX thread
      final Scene scene = TextIntegrationSceneCreator.createTextScene();
      fxPanel.setScene(scene);
   }

   public static void main(String[] arguments)
   {
      SwingUtilities.invokeLater(new Runnable()
      {
         @Override
         public void run()
         {
            initAndShowGUI();
         }
      });
   }   
}

最佳答案

您可以使用 SwingNode 将摆动内容放入 JavaFX 节点。
示例应用
之前链接的 SwingNode 文档中有一个示例应用程序:
image

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import javax.swing.*;

public class SwingFx extends Application {

    @Override
    public void start(Stage stage) {
        final SwingNode swingNode = new SwingNode();
        createAndSetSwingContent(swingNode);

        StackPane pane = new StackPane();
        pane.getChildren().add(swingNode);

        stage.setScene(new Scene(pane, 100, 50));
        stage.show();
    }

    private void createAndSetSwingContent(
        final SwingNode swingNode
    ) {
        SwingUtilities.invokeLater(() -> 
                swingNode.setContent(
                        new JButton("Click me!")
                )
        );
    }

    public static void main(String[] args) {
        launch(args);
    }
}
依赖和模块管理
如果您对 JavaFX 依赖项使用 Maven 或 Gradle,则可以使用以下方法导入用于 JavaFX/Swing 集成的库:
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-swing</artifactId>
    <version>16</version>
</dependency>
如果您正在使用 Jigsaw 功能编写模块化应用程序,请将以下内容放入您的 module-info.java文件将使 JavaFX Swing 集成模块对您的应用程序可见:
requires javafx.swing;
在 JavaFX 教程中嵌入 Swing
Oracle 提供了一个很好的教程,用于在 JavaFX 中嵌入 Swing 内容:
  • Embedding Swing Content in JavaFX Applications .

  • 本教程是为 Java 8 编写的,但仍然具有相关性。本教程涵盖线程管理和事件处理等主题,我建议任何尝试集成 JavaFX 和 Swing 的人在尝试集成之前很好地理解这些主题,否则可能会发生糟糕和不可预测的事情。
    一般来说,我建议不要混合使用 JavaFX 和 Swing 代码,除非这对您的应用程序来说是绝对必要的。
    Canvas 集成和重量级 Swing 组件
    请注意,来自 SwingNode 文档:

    The hierarchy of components contained in the JComponent instance should not contain any heavyweight components, otherwise, SwingNode may fail to paint it.


    重量级组件的一个例子是 Canvas .如果您希望在 JavaFX 中使用 awt Canvas ,请参阅:
  • Interoperability between Graphics2D and GraphicsContext

  • 具体来说,考虑使用 FXGraphics2D图书馆:

    FXGraphics2D is an implementation of Java2D's Graphics2D API that targets a JavaFX canvas.

    关于java - 如何将 Swing JPanel 嵌入到 JavaFX 框架中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68627459/

    相关文章:

    java - 随机应用程序崩溃 - 致命的开发人员错误

    java - 插入到实现泛型的二叉搜索树中

    java - 如何更改 JOptionPane.showInputDialog 中按钮的默认文本

    java - 将 MouseListener 与 vlcj 一起使用

    java - 如何处理JavaFX的线程模型和大数据变化

    java - 通过数据库表搜索id Java不工作

    java - 致命崩溃 : Focus search returned a view that wasn't able to take focus

    java - 如何制作一个动画圈?

    java - 如何在javafx中更改所有 subview 文本大小

    gnome 上的 javafx 应用程序名称