java - LibGDX - JFrame 中的 Lwjgl Canvas 无法跨平台工作

标签 java swing canvas libgdx

问题:我有一个 GDX 桌面应用程序,我想在 JFrame 中运行它,以便我可以生成其父级的其他 JFrame,这样当我关闭主游戏时,其他窗口也会关闭。

尝试的解决方案:我在 JFrame 应用程序中运行 GDX 应用程序,然后获取其 Canvas 并将其添加到内容 Pane 。

以前的代码,运行得很好(跨平台):

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        config.width  = 800;  config.height = 600;
        new LwjglApplication(new GDXRoot(), config);
    }
}

基于 JFrame 的新方法(到目前为止,我只让它在 Windows 8 上工作。它不适用于 OS X、Windows 7,甚至 Windows 10 技术预览版):

public class EditModeLauncher extends JFrame {
    final LwjglCanvas canvas;
    LwjglApplicationConfiguration config;

    public EditModeLauncher() {
        config = new LwjglApplicationConfiguration();
        config.width  = 800;  config.height = 600;
        config.resizable = false;
        canvas = new LwjglCanvas(new GDXRoot(), config);
        canvas.getCanvas().setSize(800, 600); 
        getContentPane().setPreferredSize(new Dimension(800,600));

        final JFrame test = new TestUI(this);
        test.setLocation(800,300);

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                Runtime.getRuntime().halt(0); // because of deadlocks with shut down
            }
        });

        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                getContentPane().add(canvas.getCanvas());
                setVisible(true);
                canvas.getCanvas().requestFocus();
            }
        });
        test.setVisible(true);
    }

    private class TestUI extends JFrame {
        private TestUI(final EditModeLauncher parent) {
            // code omitted ...
        }
    }

    public static void main (String[] arg) {
        new EditModeLauncher();
    }
}

有什么想法可能是什么问题吗?

最佳答案

我没有 Windows,但这对我在 Linux Mint 上有效:

    LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
    config.width = 800;
    config.height = 600;
    ApplicationListener appListener = new MyGdxGame();
    Canvas canvas = new Canvas();
    new LwjglApplication( appListener, config, canvas );

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.add( canvas );
    frame.setSize( config.width, config.height );
    frame.setLocationRelativeTo( null );
    frame.setVisible(true);

关于java - LibGDX - JFrame 中的 Lwjgl Canvas 无法跨平台工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29483861/

相关文章:

javascript - Three.JS:在不创建平面的情况下直接将纹理绘制到 Canvas 上(以广告牌的方式)

java - 为什么 Arrays.sort 方法会对链接到该方法中声明的数组的所有其他数组进行排序? java

java - 使用 GSON 将嵌套 JSON 数组解析为数组

java - 在 Android Studio 中,不能多次从 Activity A 调用 Activity B

java - 当我在外部设备上运行应用程序时,为什么它给我的是 "unfortunatley <app name > has ended"

java - JFrame.setExtendedState 实际上并没有最大化

java - Netbeans jar 文件图标问题

java - NoClassDefFoundError:无法初始化类 com.jidesoft.swing.JideSwingUtilities

javascript - 隐藏内容以防止在 JavaScript 制作的游戏中作弊

javascript - 无法读取未定义的属性 - p5js