首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFileChooser in LibGDX

JFileChooser in LibGDX
EN

Stack Overflow用户
提问于 2013-10-20 16:32:17
回答 3查看 3K关注 0票数 4

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

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

代码语言:javascript
复制
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;
    }

是swing和libgdx可弥补性问题,还是我缺少了什么?同样的代码可以很好地工作在nativa java项目中。除了:fc.showOpenDialog(null);之外,我使用:fc.showOpenDialog(button); //按钮是触发事件的JButton。

知道我做错什么了吗?

编辑:我并不介意它在除之外的其他平台上不起作用。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-23 07:01:43

好的,基于您从上面的答案中得到的评论,我感觉到您要做的是在您的LibGDX游戏窗口中调用一个swing窗口,这是一个打开的GL渲染场景。

让我在那里阻止你。swing工具箱调用它自己的呈现引擎,因为它根本不打算用于这个目的--它是为桌面应用程序设计的。因此,当您实例化对话时,所有其他oracle内容都会被实例化,比如Graphics2D类。您不能仅仅将这个类添加到scene2D阶段并期望它绘制。它们不实现相同的接口或继承相同的基类。您的Graphics2D实现的绘图(SomeClass图形)方法与SomeClass类实现的任何绘图(SomeClass foo)方法不一样。

因此,如果您想要创建一个文件选择器窗口,您需要开始查看libGDX小部件库。也许已经有人把一些东西组合在一起了,但是我下一个libGDX项目的方法是为我自己的UI库扩展这些类。我不知道您的项目是什么,也不知道您的时间线是什么样子,但这无疑是一种更好的方法,然后尝试调整swing工具包以在OpenGL呈现场景中呈现。

编辑

在快速阅读之后,我将进一步猜测swing工具箱的呈现方式完全取决于针对特定平台的JVM实现。这就是我的CS知识开始受到限制的地方,但我还要猜测,通过使用Java for C库,这与OpenGl的LWJGL实现有很大不同。

票数 4
EN

Stack Overflow用户

发布于 2017-03-27 09:50:01

就我个人而言,我不喜欢LibGDX中现有的LibGDX UI。因此,我创建了一个使用JFileChooser工作的解决方案。下面是一些快速而肮脏的代码:

代码语言:javascript
复制
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();

这将在不阻塞主线程的情况下在FileChooser窗口前面打开LibGDX。刚刚在Windows 7,8,10上测试过,它只在窗口模式ofc中工作。

票数 2
EN

Stack Overflow用户

发布于 2017-07-06 20:57:16

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

来自自述的示例:

代码语言:javascript
复制
// 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版本目前在主分支上,应该合并到库的下一个版本中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19479877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档