【问题标题】:JFileChooser in LibGDXLibGDX 中的 JFileChooser
【发布时间】:2013-10-29 01:56:21
【问题描述】:

我正在尝试在我的 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;
    }

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

知道我做错了什么吗?

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

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

【问题讨论】:

  • 对于文件处理,您应该使用 libgdx 的文件处理程序,否则它将无法在不同的平台上工作。 code.google.com/p/libgdx/wiki/FileHandling 。应该可以仅使用 Gdx 文件处理程序的这些功能来构建您的方法,并且您不会遇到任何问题。
  • 但我必须使用 UI 编写自己的文件选择器
  • 您是否打算调用一个单独的窗口来打开 JFileChooser?您将无法在您的 JLWGL 渲染场景内部调用摇摆工具包窗口。这就是为什么 libGDX 中有用于 UI 小部件(如窗口和面板)的类。

标签: java swing libgdx scene2d


【解决方案1】:

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

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

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

编辑

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

【讨论】:

    【解决方案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 上测试过,它只在窗口模式下工作。

    【讨论】:

    • 我可以确认这也适用于 Arch Linux 64 位。
    • 这很好用,我建议为框架添加f.setAlwaysOnTop(true);,这样您就不会在窗口模式下将其意外推到后台。
    【解决方案3】:

    参加聚会迟到了,但如果问题的重点是调用“本地”即。来自 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 版本当前位于主分支上,应合并到下一个版本的库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2013-04-15
      • 2010-09-20
      • 2019-12-22
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多