代码之家  ›  专栏  ›  技术社区  ›  Archimedes Trajano

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

  •  0
  • Archimedes Trajano  · 技术社区  · 3 年前

    从…起 Integrating JavaFX 2.0 with Swing and SWT 有一个代码允许您在Swing JFrame中嵌入JFXPanel。我想知道有没有相反的情况,JPanel嵌入在 Application Stage 相当于 JFrame 如中所述 Converting 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();
             }
          });
       }   
    }
    
    1 回复  |  直到 3 年前
        1
  •  4
  •   jewelsea    2 年前

    您可以使用 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);
        }
    }
    

    依赖关系和模块管理

    如果您使用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代码,除非这对您的应用程序来说是绝对必要的。

    画布集成和重量级摆动组件

    注意,从SwingNode文档中:

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

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

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

    FXGraphics2D是Java2D的Graphics2D API的一个实现,它以JavaFX画布为目标。


    Maven不知道javafx.embed.swing。知道在哪里能找到它吗?

    对于正确配置的Maven设置,情况不应该如此。

    所有JavaFX框架模块都在 central maven repository .

    在标准maven安装中,默认情况下会启用中央maven存储库。

    javafx-swing的maven坐标已经在这个答案中了(在标题为“依赖关系和模块管理”的部分下)。

    更新依赖项版本以匹配您正在使用的JavaFX版本。

    依赖项的最新稳定版本是 18.0.1 今天,所以要使用它,请确保 全部的 您所依赖的javafx组件使用该版本作为其javafx依赖项。

    或者,您可以

    然而,我建议使用对Maven或Gradle构建工具的依赖,而不是依赖手动下载的模块或JavaFXSDK。