Applet在JavaFX应用程序中是不可见的

时间:2016-06-04 19:33:19

标签: java swing javafx applet

我正在将我的GUI从Swing转换为JavaFX(因此我可以更轻松地添加自定义样式的东西)。

我让我的应用程序在Swing中工作,但我无法在JavaFX中使用它。

我想要的是将外部小程序加载到SwingNode中。小程序有自动播放的音乐,我可以听到但我看不到任何内容。

我很难找到相关文档或帮助。

我的代码:

ClientNew.java

package rsclient.coregui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.concurrent.ExecutionException;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.stage.Stage;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import rsloader.Loader;

public class ClientNew extends Application {

    @Override
    public void start(Stage stage) throws InterruptedException, ExecutionException {

        SwingNode swingNode = new SwingNode();

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final Loader loader = new Loader(Loader.Game.OSRS);
                loader.applet.setLayout(null);
                loader.applet.resize(800, 550);

                JPanel gamepanel = new JPanel(new BorderLayout());
                gamepanel.add(loader.applet, BorderLayout.CENTER);

                swingNode.setContent(gamepanel);

                gamepanel.setVisible(true);
            }
        });

        Tab tab = new Tab();
        tab.setText("My Tab");
        tab.setClosable(false);
        tab.setContent(swingNode);

        TabP ane tabPane = new TabPane();
        tabPane.getStyleClass().add("tabbedPane");
        tabPane.getTabs().add(tab);

        stage.setScene(
            new Scene(
                tabPane,
                1000, 650
            )
        );

        stage.setTitle("My APplication");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Loader.java (不是我的代码,但似乎有效。稍后会重构)

package rsloader;

import java.applet.Applet;
import java.applet.AppletContext;
import java.applet.AppletStub;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import rsreflection.Reflector;

/***
 *@author Xel
 *@version 1.0
 *@project RSLoader
 *@file Loader.java
 *@date 18.10.2013
 *@time 10.43.48
 */
public class Loader implements AppletStub{
    //insane declarations
    public enum Game{OSRS, RS3, CLASSIC};
    public static final HashMap<String, String> Parameters = new HashMap<String, String>();
    public Game game;
    public URL GamePack;
    public Applet applet;
    public String gameUrl;
    public String MClass;
    public Reflector loader;

    public Loader(Game g)
    {
        game = g;
        if(game == Game.OSRS)
            gameUrl = "http://oldschool69.runescape.com/";
        else if(game == Game.RS3)
            gameUrl = "http://world1.runescape.com/";
        else
            gameUrl = "http://classic2.runescape.com/plugin.js?param=o0,a0,s0";

        try {
            GetParams(new URL(gameUrl));
                        loader  = new Reflector(new URL[]{GamePack});
            applet = (Applet)loader.loadClass(MClass).newInstance();
            applet.setStub(this);
            applet.init();
            applet.start();
        } catch (IOException | InstantiationException | IllegalAccessException | ClassNotFoundException e1) {
            e1.printStackTrace();
        }
    }

    public void GetParams(URL url) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
        String line;
        List<String> params = new ArrayList<String>();
        while((line = reader.readLine()) != null)
        {
            if(line.contains("param name"))
                params.add(line);
            if(GamePack == null) //retarted block
                if(line.contains("archive"))
                    if(game != Game.CLASSIC)
                        GamePack = new URL(gameUrl + line.substring(line.indexOf("archive=") + 8, line.indexOf(" ');")));
                    else
                        GamePack = new URL("http://classic2.runescape.com/" + line.substring(line.indexOf("archive=") + 8, line.indexOf(" code")));
            if(MClass == null)
                if(line.contains("code="))

                        MClass = line.substring(line.indexOf("code=") + 5, line.indexOf(".class"));
        }
        reader.close();

        for(String s : params)
        {
            Parameters.put(GetParamName(s), GetParamValue(s));
        }
    }

    public String GetParamName(String param)
    {
        try{
            int StartIndex = param.indexOf("<param name=\"") + 13;
            int EndIndex = param.indexOf("\" value");
            return param.substring(StartIndex, EndIndex);
        }catch(StringIndexOutOfBoundsException e)//classic handles some differently so why not just catch it =P
        {
            int StartIndex = param.indexOf("<param name=") + 12;
            int EndIndex = param.indexOf(" value");
            return param.substring(StartIndex, EndIndex);
        }
    }

    public String GetParamValue(String param)
    {
        try{
            int StartIndex = param.indexOf("value=\"") + 7;
            int EndIndex = param.indexOf("\">');");
            return param.substring(StartIndex, EndIndex);
        }catch(StringIndexOutOfBoundsException e)//and again :D
        {
            int StartIndex = param.indexOf("value=") + 6;
            int EndIndex = param.indexOf(">');");
            return param.substring(StartIndex, EndIndex);
        }
    }

    @Override
    public void appletResize(int arg0, int arg1) {
    }

    @Override
    public AppletContext getAppletContext() {
        return null;
    }

    @Override
    public URL getCodeBase() {
        try
        {
            if(game == Game.OSRS)
                return new URL("http://oldschool1.runescape.com/");
            else if(game == Game.RS3)
                return new URL("http://world1.runescape.com/");
            else
                return new URL("http://classic2.runescape.com/");
        }catch(MalformedURLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public URL getDocumentBase() {
        try
        {
            if(game == Game.OSRS)
                return new URL("http://oldschool1.runescape.com/");
            else if(game == Game.RS3)
                return new URL("http://world1.runescape.com/");
            else
                return new URL("http://classic2.runescape.com/");
        }catch(MalformedURLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String getParameter(String arg0) {
        return Parameters.get(arg0);
    }

    @Override
    public boolean isActive() {
        return false;
    }
}

2 个答案:

答案 0 :(得分:0)

我也试图在JavaFX中实现swing applet。我看不到该应用程序。获得根窗格的大小后,我看到它的Dimension是0,0。 applet不会使用JavaFX自动调整大小。我在JApplet中的init方法中添加了以下行。

this.getRootPane().setMinimumSize(new Dimension(900,600)); 

这允许我设置applet的大小。我正在努力实现一个监听器,以便它与窗口一起调整大小。

答案 1 :(得分:0)

对于使用JavaFX呈现applet这个问题的任何人

Swing不支持渲染重量级组件。 对于那些希望用javafx渲染重量级游戏或应用程序的人来说,重量级组件仍然存在,而且还没有任何支持。