有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

是否可以在JavaFX应用程序(桌面)中使用现有的小程序

我似乎找不到这方面的任何东西——除了它不能嵌入到web视图中

我目前有一个图像查看产品,可以通过小程序访问,并通过HTML页面上的JavaScript进行控制

我正在调查一个使用JavaFX的客户端应用程序,它可能需要访问该小程序。我试图将其嵌入WebView,但没有成功。在这个网站上搜索表明webview不支持插件技术。这是用Java FX构建一个小程序——而是调用现有产品并与之交互

因此,我想知道是否还有另一种方法——使用JavaFX8

谢谢


共 (1) 个答案

  1. # 1 楼答案

    通过一个非常简单的小程序示例的快速试用,演示了将Swing小程序嵌入JavaFX应用程序(使用Java8)的可能性

    样本

    hello

    以下是来自Oracle getting started with applets documentation的HelloWorld小程序:

    import javax.swing.*;
    
    public class HelloWorldApplet extends JApplet {
        public void init() {
            try {
                SwingUtilities.invokeAndWait(new Runnable() {
                    public void run() {
                        JLabel lbl = new JLabel("Hello World");
                        add(lbl);
                    }
                });
            } catch (Exception e) {
                System.err.println("createGUI didn't complete successfully");
            }
        }
    }
    

    下面是一个嵌入它的JavaFX应用程序:

    import javafx.application.Application;
    import javafx.embed.swing.SwingNode;
    import javafx.scene.*;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    import javax.swing.JApplet;
    import javax.swing.SwingUtilities;
    import java.awt.Dimension;
    
    import java.util.concurrent.*;
    
    public class JavaFXSwingAppletHolderApplication extends Application {
        private JApplet applet = new HelloWorldApplet();
        private Dimension appletSize;
    
        @Override public void init() throws ExecutionException, InterruptedException {
            applet.init();
    
            FutureTask<Dimension> sizingTask = new FutureTask<>(() ->
                applet.getRootPane().getPreferredSize()
            );
            SwingUtilities.invokeLater(sizingTask);
            appletSize = sizingTask.get();
        }
    
        @Override public void start(Stage stage) {
            final SwingNode swingNode = new SwingNode();
            SwingUtilities.invokeLater(() ->
                swingNode.setContent(applet.getRootPane())
            );
    
            stage.setScene(
                new Scene(
                    new Group(swingNode),
                    appletSize.getWidth(), appletSize.getHeight(),
                    Color.BLACK
                )
            );
            stage.show();
        }
    
        @Override public void stop() {
            applet.stop();
            applet.destroy();
        }
    
        public static void main(String[] args) {
             launch(args);
         }
    }
    

    注释

    我不确定sizingTask是否正确——上面的代码是严格必要的,我只是把它放在那里以防万一,因为我对Swing布局知之甚少,所以我认为最好是明确的

    此示例只嵌入了一个基本的小程序,您的小程序将更加复杂,因此您需要为特定的小程序验证一个类似的解决方案,以确保它适用于您

    推荐

    大多数现有的小程序都很小——最好将小程序重新实现为纯JavaFX组件实现,而不是尝试将小程序嵌入JavaFX应用程序中

    还请注意,applet API作为Java 9的一部分被JEP 289: Deprecated the Applet API弃用