Как правильно разместить приложение libgdx внутри приложения swing?

Я создаю редактор уровней для своей игры, и у меня проблема с использованием LwjglCanvas с JFrame. Я использую JFrame (не LwjglFrame), чтобы поддерживать как можно более независимый редактор движка и уровня. У меня два JAR: WorldEditor.jar и GameEngine.jar. Внутри WorldEditor у меня есть кнопка под названием "test", то есть предположим, что загрузите GameEngine.jar(если она еще не загружена) и запустите (переставьте ее, если она уже загружена) в основной кадр приложения. Фактически, то, что я делаю, это инъекция игрового контейнера WorldEditor (например JPanel внутри JFrame) в игровое приложение и использование 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 никогда не вызывается (из-за того, что приложение не должно быть видимым, я ошибаюсь?) Я пробовал в течение долгого времени, но никакого результата...

Есть ли у кого-то представление о том, что я могу сделать, чтобы исправить эту проблему? Или, по крайней мере, еще один способ (пусть проще) сделать это?

Ответ 1

Вы должны использовать SwingUtilites.invokelater, потому что postRunnable сообщения в игровой цикл, который не запущен. Я попытался бы получить компонент из MyGame и добавить его. Если вы вернете компонент, у вас нет депо. к LwjglCanvas. Это не очень приятно, потому что теперь у интерфейса MyGame есть папка. качать, но это стоит того, чтобы понять, разрешает ли ваша проблема ваша проблема.

Ответ 2

Вот как я это делаю:

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 для моего игрового класса, что упрощает работу с моим редактором.

Ответ 3

Я использовал метод Per-Erik Bergman (выше), но почему-то я не могу "спрятать" свой JPanel на основе libGDx - графический фрейм остается намазанным поверх всех других элементов пользовательского интерфейса Swing-приложений.

Как только JPanel на основе libGDx создан, его нельзя скрыть. Он исчезнет, если вы удалите JPanel из родительского объекта, но тогда мы получим SIGSEGV, когда вы добавите его обратно.