4

我正在尝试在我的 LibGDX scene2d 项目中使用 Javas JFileChooser,但是一旦我启动 JFileChooser,我的程序就会冻结。

这是我用来启动文件选择器的代码:

private String getPath(){
    String path = "";
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        int returnVal = fc.showOpenDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = fc.getSelectedFile();
            try {
                path = file.getAbsolutePath();
            } catch (Exception ex) {
                System.out.println("problem accessing file" + file.getAbsolutePath() + "\n" + ex.getMessage());
            }
        } else {
            System.out.println("File access cancelled by user.");
        }
        return path;
    }

是摆动和 libgdx 兼容性问题还是我遗漏了什么?相同的代码与 nativa java 项目完美配合。除了代替:fc.showOpenDialog(null); 我使用:fc.showOpenDialog(button); // button 是触发事件的JButton。

知道我在做什么错吗?

编辑:我真的不介意它是否不能在 Windows 以外的其他平台上运行。

但是如果我选择使用跨平台解决方案,并使用 LibGDX 的方法,我是否必须自己从头开始创建带有 UI 的文件选择器类?

4

3 回答 3

4

好的,根据您对上述答案的评论,我感觉到您正在尝试做的是在您的 LibGDX 游戏窗口内调用一个摆动窗口,这是一个开放的 GL 渲染场景。

让我在那儿阻止你。swing 工具包调用它自己的渲染引擎,因为它根本不是为此目的而设计的——它是为桌面应用程序设计的。因此,当您实例化对话时,各种其他 oracle java 的东西都会随之实例化,例如 Graphics2D 类。您不能只是将此类添加到场景 2D 阶段并期望它绘制。它们不实现相同的接口或从相同的基类继承。JFileChooser 实现的 draw(Graphics2D graphics) 方法与 libGDX 类实现的 draw(SomeClass foo) 方法不同。

所以如果你想制作一个文件选择器窗口,你需要开始查看 libGDX 小部件库。可能有人已经组合了一些东西,但我的下一个 libGDX 项目的方法是为我自己的 UI 库扩展这些类。我不知道你的项目是什么,或者你的时间线是什么样的,但它肯定是一种更好的方法,然后尝试调整 swing 工具包以在 OpenGL 渲染场景中渲染。

编辑

在快速阅读之后,我将进一步猜测,swing 工具包的渲染方式完全取决于特定平台的 JVM 实现。现在这就是我的 CS 知识开始有点有限的地方,但我会冒险另一个猜测,这与使用 C 库的 Java 包装器的 OpenGl 的 LWJGL 实现方式截然不同。

于 2013-10-23T07:01:43.727 回答
2

我个人不喜欢 LibGDX 中现有的 FileChooser UI。所以我创建了一个使用 JFileChooser 的解决方案。这是一些快速而肮脏的代码:

new Thread(new Runnable() {             
    @Override
    public void run() {
        JFileChooser chooser = new JFileChooser();
        JFrame f = new JFrame();
        f.setVisible(true);
        f.toFront();
        f.setVisible(false);
        int res = chooser.showSaveDialog(f);
        f.dispose();
        if (res == JFileChooser.APPROVE_OPTION) {
            //Do some stuff     
        }
    }
}).start();

这将在 LibGDX 窗口前面打开 FileChooser,而不会阻塞主线程。刚刚在 Windows 7、8、10 上对此进行了测试,它仅适用于窗口模式 ofc。

于 2017-03-27T09:50:01.630 回答
0

迟到了,但如果问题的重点是调用“本地”即。来自 libgdx 项目的非 gdx 文件选择器我在这里创建了一个库:https ://github.com/spookygames/gdx-nativefilechooser 。

自述文件中的示例:

// Configure
NativeFileChooserConfiguration conf = new NativeFileChooserConfiguration();

// Starting from user's dir
conf.directory = Gdx.files.absolute(System.getProperty("user.home"));

// Filter out all files which do not have the .ogg extension and are not of an audio MIME type - belt and braces
conf.mimeFilter = "audio/*";
conf.nameFilter = new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith("ogg");
    }
};

// Add a nice title
conf.title = "Choose audio file";

fileChooser.chooseFile(conf, new NativeFileChooserCallback() {
    @Override
    public void onFileChosen(FileHandle file) {
        // Do stuff with file, yay!
    }

    @Override
    public void onCancellation() {
        // Warn user how rude it can be to cancel developer's effort
    }

    @Override
    public void onError(Exception exception) {
        // Handle error (hint: use exception type)
    }
});

在桌面上,此示例当前将启动 AWT FileDialog(不完全是所要求的),但 Swing 版本当前位于主分支上,应该合并到下一个版本的库中。

于 2017-07-06T20:57:16.437 回答