使用一個非常簡單的示例applet進行的快速試用表明,可以將Swing applet嵌入到JavaFX應用程序(使用Java 8)中。
樣品
下面是從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棄用。
感謝您的建議!我不確定我能否使用它。我嘗試使用的小程序是客戶端服務器圖像查看器。我將JAR導入到項目中,導入了配置爲被調用的小程序 - 但是我無法在小程序本身上找到getRootPane()方法。我也似乎無法找到任何返回JComponent的東西。我會繼續看看我能否找到任何東西,並真正感謝這個指針。 –
我嘗試使用的小程序擴展了 - java.applet.Applet,而不是上面引用的JApplet。希望能提供更多的信息。謝謝! –
我的applet也使用了很多初始化參數:不確定如何加載這些參數。我能夠在沒有調整大小的情況下啓動小程序,但沒有參數就幾乎沒用。 –