java - Applet 在 JavaFX 应用程序中不可见

标签 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;
    }
}

最佳答案

对于任何遇到使用 JavaFX 渲染小程序的问题的人

Swing 不支持重量级组件的渲染。 目前仍然没有任何对重量级组件的支持,这对于那些希望使用 javafx 渲染重量级游戏或应用程序的人来说显然很糟糕。

关于java - Applet 在 JavaFX 应用程序中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37634239/

相关文章:

java - 相当于什么button3_Click(sender, e);在Java中?

java - 更改 Action 监听器中的变量数据

java - 如何用不同的 Unicode 字符构建最长的字符串

java - 无法写入 BLE GattCharacteristic

java - 如何检查 java.awt 中有哪些字体可用?

java - 如何使列表中的对象符合垃圾收集条件?

java - 具有模态的舞台隐藏最大化按钮

java - 切换 FXML 场景

java - JSF 1.2,是否有任何实用程序可以学习它是如何工作的?

java - Java 什么时候调用 finalize() 方法?