[gluon]平台是桌面时如何在胶子中使用FileChooser?

时间:2018-03-07 09:05:21

标签: gluon javafxports

我知道Gluon mobile不能使用FileChooser。 但我的问题是,当我尝试在Desktop中使用PicturesService加载图像时,它无法正常工作。 所以我想知道何时平台是Desktop然后使用FileChooser。 但只是不能上台? 你能帮忙解决一下吗?

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

1 个答案:

答案 0 :(得分:0)

如果您在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
  • 将类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.");
    }

}
  • 现在添加FileChooser:

这是一个简单的实现:

@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(如果存在)...