当平台是桌面时,如何在 gluon 中使用 FileChooser?

How to use FileChooser in gluon when platform is Desktop?

我知道Gluon mobile 不能使用FileChooser。 但我的问题是,当我尝试使用 PicturesService 在 Desktop 中加载 ImageFromGallery 时,它无法正常工作。 所以我想知道什么时候平台是桌面,然后使用 FileChooser。 但是就是上不了台? 能帮忙看看怎么解决吗?

FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(stage);
                                       ^^^^^

如果您在 Charm Down 中检查图片服务的 source code,则尚未实施 DesktopPicturesService

这意味着对 service.loadImageFromGallery() 的调用:

Services.get(PicturesService.class).ifPresent(service -> service.loadImageFromGallery());

如果您 运行 在桌面上,则不会完成。

一个快速的解决方案是检测到您在桌面上 运行,然后直接调用 FileChooser,否则使用图片服务:

if (Platform.isDesktop()) {
    FileChooser...
} else {
    Services.get(PicturesService.class).ifPresent(service -> service.loadImageFromGallery());
} 

为了更好的集成,没有什么能阻止您将缺少的 DesktopPicturesService 实现添加到您的项目中,并包含一个 FileChooser,以便能够在您的应用程序中加载图片。

为此你只需要:

  • pictures 插件添加到 DownConfig (build.gradle)
  • 中的服务列表
  • 将以下包添加到 Desktop/Java Packages 文件夹:com.gluonhq.charm.down.plugins.desktop
  • 将 class DesktopPicturesService 添加到实现 PicturesService 的包中,并实现所需的方法:

DesktopPicturesService.java

public class DesktopPicturesService implements PicturesService {

    @Override
    public Optional<Image> takePhoto(boolean savePhoto) {
        throw new UnsupportedOperationException("Not supported yet."); 
    }

    @Override
    public Optional<Image> loadImageFromGallery() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
  • 现在添加文件选择器:

这是一个简单的实现:

@Override
public Optional<Image> loadImageFromGallery() {
    FileChooser fileChooser = new FileChooser();
    FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
    fileChooser.getExtensionFilters().addAll(extFilterJPG);

    try {
        File file = fileChooser.showOpenDialog(null);
        if (file != null) {
            Image image = new Image(new FileInputStream(file));
            return Optional.ofNullable(image);
        }
    } catch (FileNotFoundException ex) {}
    return Optional.empty();
}

关于stage参数,可以设置为null,或者从MobileApplication实例中获取:

Stage stage = MobileApplication.getInstance().getView().getScene().getWindow();
  • 最后,在您的应用程序中使用您的服务。

添加一个 ImageView 并调用服务:

ImageView imageView = new ImageView();
Services.get(PicturesService.class).ifPresent(pictures -> {
    pictures.loadImageFromGallery().ifPresent(imageView::setImage);
});

这现在可以在桌面和移动设备上使用。

另外,您还可以实施 takePhoto 方法,访问台式计算机的 webCam,如果存在...