【问题标题】:How do you embed a Swing JPanel into a JavaFX frame?如何将 Swing JPanel 嵌入到 JavaFX 框架中?
【发布时间】:2021-10-08 03:40:49
【问题描述】:

来自Integrating JavaFX 2.0 with Swing and SWT 的代码允许您在 Swing JFrame 中嵌入 JFXPanel。我想知道 JPanel 是否嵌入在 ApplicationStage 中,这与 JFrame 中所指出的 Converting from Swing to JavaFX? 中的 JFrame 等价

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

【问题讨论】:

    标签: java swing javafx


    【解决方案1】:

    您可以使用 SwingNode 将摇摆内容放入 JavaFX 节点。

    示例应用程序

    之前链接的 SwingNode 文档中有一个示例应用程序:

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

    依赖和模块管理

    如果您将 Maven 或 Gradle 用于 JavaFX 依赖项,则可以使用以下方法导入库以进行 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 内容的教程:

    本教程是为 Java 8 编写的,但仍然适用。本教程涵盖线程管理和事件处理等主题,我建议任何尝试集成 JavaFX 和 Swing 的人在尝试集成之前很好地理解这些主题,否则可能会发生不好的和不可预测的事情。

    一般来说,我建议不要混合 JavaFX 和 Swing 代码,除非这对您的应用程序绝对必要。

    Canvas 集成和重量级 Swing 组件

    注意,来自 SwingNode 文档:

    JComponent 实例中包含的组件层次结构不应包含任何重量级组件,否则SwingNode 可能无法绘制它。

    重量级组件的一个例子是Canvas。如果您希望在 JavaFX 中使用 awt 画布,请参阅:

    具体来说,考虑使用FXGraphics2D 库:

    FXGraphics2D 是针对 JavaFX 画布的 Java2D 的 Graphics2D API 的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2014-06-19
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多