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

时间:2014-05-14 18:56:42

标签: applet javafx desktop-application

我似乎无法在此处找到任何内容 - 除了它无法嵌入到网络视图中。

我目前有一个图片查看产品,可以通过applet访问,并通过HTML页面控制。

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

因此,我想知道是否还有其他方式 - 使用JavaFX 8?

谢谢!

1 个答案:

答案 0 :(得分:2)

使用非常简单的示例applet进行快速试用,演示了可以将Swing applet嵌入到JavaFX应用程序中(使用Java 8)。

<强>示例

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布局知之甚少,所以认为最好是明确的。

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

<强>建议

大多数现有applet非常小 - 将applet重新实现为纯JavaFX组件实现可能更好,而不是尝试将applet嵌入JavaFX应用程序中。

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