Java 如何在swing应用程序中正确放置libgdx应用程序?

Java 如何在swing应用程序中正确放置libgdx应用程序?,java,swing,libgdx,Java,Swing,Libgdx,我正在为我的游戏创建一个关卡编辑器,我在使用LwjglCanvas和JFrame时遇到了一个问题。我使用JFrame(而不是LwjglFrame)尽可能保持引擎和级别编辑器的独立性。 我有两个jar:WorldEditor.jar和GameEngine.jar。在WorldEditor中,我有一个名为“test”的按钮,该按钮用于加载GameEngine.jar(如果尚未加载)并将其启动(如果已加载,则重新启动)到应用程序主框架中。 实际上,我所做的是将WorldEditor游戏容器(例如JFr

我正在为我的游戏创建一个关卡编辑器,我在使用LwjglCanvas和JFrame时遇到了一个问题。我使用JFrame(而不是LwjglFrame)尽可能保持引擎和级别编辑器的独立性。 我有两个jar:WorldEditor.jar和GameEngine.jar。在WorldEditor中,我有一个名为“test”的按钮,该按钮用于加载GameEngine.jar(如果尚未加载)并将其启动(如果已加载,则重新启动)到应用程序主框架中。 实际上,我所做的是将WorldEditor游戏容器(例如JFrame中的JPanel)注入到游戏应用程序中,并使用
Gdx.app.postrunable
将lwjglcanvas添加到注入的游戏容器中:

世界编辑部:

JPanel _gameContainer = new JPanel(); // is inside a JFrame
MyGame game = loadGame(_gameContainer); // load the GameEngine JAR, and retrive the game
游戏引擎端:

// container is the _gamecontainer of above
public void createGame(final Container gameContainer)  
{
    LwjglCanvas canvas = new LwjglCanvas(myapp, myconfig);
    Gdx.app.postRunnable(new Runnable()
    {
       public void run()
       {
           gameContainer.add(canvas.getCanvas());
       }
    });
}
事实上,
postRunnable
从未被调用(因为应用程序在可见之前不会被调用,我错了吗?) 我已经尝试了很长时间,但没有结果


有人知道我能做些什么来解决这个问题吗?或者至少有另一种(更简单的)方法可以做到这一点?

您必须使用SwingUtilites.invokelater,因为postRunnable会向未运行的游戏循环发送帖子。我会尝试从我的游戏中获取一个组件并添加这个。如果返回组件,则LwjglCanvas中没有dep。这不是很好,因为现在MyGame界面有一个dep.可以打开,但值得一试,看看它是否能解决您的问题。

我就是这样做的:

public class EditorApp extends JFrame {

    public EditorApp() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final Container container = getContentPane();
        container.setLayout(new BorderLayout());

        LwjglAWTCanvas canvas = new LwjglAWTCanvas(new MyGame(), true);
        container.add(canvas.getCanvas(), BorderLayout.CENTER);

        pack();
        setVisible(true);
        setSize(800, 600);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new EditorApp();
            }
        });
    }
}

我的游戏类中也有一些API,使其易于从编辑器中使用。

我想我已经尝试过了,但遇到了一些线程问题。不管怎样,今晚我会看看你的解决方案,谢谢。是的!使用
SwingUtilities.invokeLater
有效!游戏将出现在JFrame中。现在我必须处理一些其他问题(应用程序窗口不会关闭,游戏也不会出现在它应该出现的位置)。谢谢从文档中:请注意,您可能需要调用stop(),否则Swing应用程序可能会因LWJGL和/或Swing如何处理关闭挂钩而在System.exit上死锁。谢谢,我修复了这个问题,现在应用程序可以正常关闭:)即使你提出的解决方案完全依赖于游戏和编辑器,我也会尝试。我认为主要的好处是,我可以在玩游戏的同时编辑游戏关卡,使其真正强大。这是真的,实际上,这正是我想要做的:)第二个参数,
true
过去做什么?似乎他们从较新的版本中删除了它。它曾用于启用opengl es 2.0:public Lwjglawtcavas(ApplicationListener listener,boolean useGL2){。。。