当平台是桌面时,如何在 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,如果存在...
我知道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,如果存在...