2014-05-14 72 views
3

我似乎無法找到任何東西 - 除了它不能嵌入到Web視圖中。是否有可能在JavaFX應用程序(桌面)中使用現有的Applet

我目前有一個圖像查看產品,通過一個applet訪問並通過JavaScript從HTML頁面控制。

我在調查使用JavaFX的客戶端應用程序,它可能需要訪問該applet。我試圖將其嵌入到WebView中,但沒有奏效。在這個網站搜索表明,webview不支持插件技術。這是用Java FX構建一個applet,而是調用現有產品並與之交互。

因此,我想知道是否有另一種方式 - 使用JavaFX 8?

謝謝!

回答

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作爲一個純粹的JavaFX組件實現,而不是嘗試嵌入小程序在JavaFX應用程序。

另請注意,applet API作爲Java 9的一部分被JEP 289: Deprecated the Applet API棄用。

+0

感謝您的建議!我不確定我能否使用它。我嘗試使用的小程序是客戶端服務器圖像查看器。我將JAR導入到項目中,導入了配置爲被調用的小程序 - 但是我無法在小程序本身上找到getRootPane()方法。我也似乎無法找到任何返回JComponent的東西。我會繼續看看我能否找到任何東西,並真正感謝這個指針。 –

+0

我嘗試使用的小程序擴展了 - java.applet.Applet,而不是上面引用的JApplet。希望能提供更多的信息。謝謝! –

+0

我的applet也使用了很多初始化參數:不確定如何加載這些參數。我能夠在沒有調整大小的情況下啓動小程序,但沒有參數就幾乎沒用。 –

相關問題