Переместите Canvas / LwjglCanvas на другую панель, не уничтожая libGDX или LwjglApplication - PullRequest
0 голосов
/ 14 июля 2020

Моя цель - написать редактор, который отображает приложение libGdx в Swing gui. В редакторе пользователь может выбирать между различными «режимами редактирования». Если пользователь выбирает представление редактора, старое представление, содержащееся в JPanel, удаляется или становится невидимым, и новое представление отображается на экране.

Проблема в следующем: в нескольких представлениях я хочу иметь один JPanel, где отображается Canvas / LwjglCanvas с моим рисунком libGDX. Но как только я удаляю холст из старого представления и пытаюсь добавить его в новое выбранное представление, вызывается процедура swing destroyNotify (), которая закрывает холст, на котором нарисован libGdx. Затем я могу добавить его снова в JPanel представления, но он больше не отображает приложение.

В настоящее время это моя установка для рисования libGDX:

    LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
    config.width = 1920;
    config.height = 1080;
    
    canvas = new Canvas();
    
    LwjglApplication app = new LwjglApplication( appListener, config, canvas );

Я попытался переопределить removeNotify () холста , поэтому холст не понимает, что он перемещается в другую панель редактора. Но это не работает и выдает исключение NullPointerException:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sun.java2d.ScreenUpdateManager.createScreenSurface(ScreenUpdateManager.java:86)
at sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface(D3DScreenUpdateManager.java:152)
at sun.awt.windows.WComponentPeer.createScreenSurface(WComponentPeer.java:462)
at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:486)
at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:454)
at sun.awt.windows.WComponentPeer.updateGraphicsData(WComponentPeer.java:545)
at java.awt.Component.updateGraphicsData(Component.java:1179)
at java.awt.Container.updateGraphicsData(Container.java:1161)
at java.awt.Component.setGraphicsConfiguration(Component.java:1159)
at java.awt.Container.remove(Container.java:1223)
at java.awt.Container.remove(Container.java:1267)

Итак, есть ли вероятность, что я могу удалить свой холст из одного JPanel и добавить его в другой JPanel без отключения графики холста? Я не могу создать холст для каждого представления, потому что у вас может быть только один экземпляр OpenAL. Это была бы работа ... И предпочтительно я не хочу выключать LwjglApplication и повторно инициализировать его каждый раз, когда пользователь переключает представление, потому что время инициализации LwjglApplication заметно. Как бы вы go об этой проблеме?

...