我知道Gluon mobile不能使用FileChooser。 但我的问题是,当我尝试在Desktop中使用PicturesService加载图像时,它无法正常工作。 所以我想知道何时平台是Desktop然后使用FileChooser。 但只是不能上台? 你能帮忙解决一下吗?
FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(stage);
^^^^^
答案 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.");
}
}
这是一个简单的实现:
@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(如果存在)...