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

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

世界编辑方面:

 JPanel _gameContainer = new JPanel(); // is inside a JFrame MyGame game = loadGame(_gameContainer); // load the GameEngine JAR, and retrive the game 

GameEngine方面:

 // 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会发布到未运行的游戏循环。 我会尝试从MyGame获取一个Component并添加它。 如果您返回一个Component,则表示您没有dep。 到LwjglCanvas。 它不是那么好,因为现在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,可以让我的编辑器轻松使用。