最近我开发了一款个人软件来帮助我完成日程安排。我曾试图让荷马辛普森大吃一碟,作为一个很酷的启动闪屏,但遗憾的是GIF不会播放。
这是整个代码
public class Homer extends Application
{
public static final String SPLASH_GIF =
"https://media.giphy.com/media/JRQ1PegFVKXBu/giphy.gif";
private static final int SPLASH_WIDTH = 400;
private static final int SPLASH_HEIGHT = 224;
private Pane splashLayout;
public static void main(String[] args) throws Exception
{ launch(args); }
@Override
public void start(final Stage initStage) throws Exception {
ImageView splash = new ImageView(new Image(
SPLASH_GIF
));
splashLayout = new Pane();
splashLayout.getChildren().add(splash);
Scene scene = new Scene(splashLayout, SPLASH_WIDTH, SPLASH_HEIGHT);
scene.setFill(Color.TRANSPARENT);
initStage.initStyle(StageStyle.TRANSPARENT);
initStage.setWidth(SPLASH_WIDTH);
initStage.setHeight(SPLASH_HEIGHT);
initStage.setScene(scene);
initStage.show();
System.out.println("finished");
}
}
将图片格式切换为PNG,如下所示
public static final String SPLASH_GIF =
"http://www.dashboardwidgets.com/showcase/data/43/homerQuotes-1p2f.png";
这将只是一个简单的荷马图片,而不是吃香蕉。我希望有一个GIF。
怎么可能?
答案 0 :(得分:2)
在尝试你的例子时,我可以把它放到
com.sun.javafx.iio.ImageStorageException: No loader for image data
如果我使用的是不同的网址,其中包含由http加载的动画gif,而不是http s (http://www.picgifs.com/music-graphics/music-graphics/beatles/music-graphics-beatles-186070.gif),并且ImageView正在运行。
我还用香蕉下载了Homer并将其保存并加载
final ImageView imageView = new ImageView(new Image("file:JRQ1PegFVKXBu.gif"));
ImageView的工作原理正确。
我在JavaFX API中没有发现不支持https的提示,但是在启动启动画面中不做下载会更好,因为这可能需要很长时间。
答案 1 :(得分:2)
失败是因为源链接是html文件而不是gif文件
问题在于,某些Folk的问题中的链接实际上并不是图像(即使网址以.gif
结尾),而是HTML页面或重定向到HTML页面(您可以看到这一点)通过在浏览器中加载链接)。
如果替换html链接:
使用实际的GIF链接:
然后GIF图像加载和显示按预期工作。
除了支持图像加载的协议
实际上问题与https无关。 JavaFX API确实通过https正确实现加载图像。根据Image javadoc:
URL支持的所有网址都可以传递给构造函数。如果传递的字符串不是有效的URL,而是路径,则在这种情况下在类路径上搜索Image。
底层JavaFX图像实现只是来自URL类的opens a stream(可以通过搜索JavaFX源代码来确定)。因此,底层JRE实现支持的任何协议都将与JavaFX图像类一起使用。其中包括http:
,https:
,file:
和jar:
协议;并且可能包括其他人,具体取决于JRE的实施。如果您愿意,甚至可以添加custom protocol handlers。