当前位置: 首页 > 知识库问答 >
问题:

JavaFX在ImageView中播放gif图像

公西博实
2023-03-14

我看到这个问题问了很多,但我还没有看到一个非常普遍的方法。我正在使用JavaFX在JavaEclipse Oxygen中开发一个桌面应用程序,我有一个加载器,我想在任何时候通过超文本传输协议加载图像。当用户单击不同的行时,图像必须通过超文本传输协议加载。所以我把我的加载器放在图像的顶部,我只是使用;productPreviewLoader.set可见(true)来显示或隐藏它。fxml中的加载器ImageView在GridPane中看起来像这样。

<GridPane>
   <columnConstraints>
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints minHeight="10.0" valignment="TOP" vgrow="ALWAYS" />
      <RowConstraints vgrow="SOMETIMES" />
      <RowConstraints vgrow="SOMETIMES" />
   </rowConstraints>
   <children>
      <ImageView fx:id="productPreview" fitHeight="282.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" />
      <!-- This is the loader-->
      <ImageView fx:id="productPreviewLoader" fitHeight="112.0" fitWidth="136.0" pickOnBounds="true" preserveRatio="true" /> 
      <TextFlow fx:id="productPreviewTextFlow" GridPane.rowIndex="1">
         <GridPane.margin>
            <Insets right="10.0" />
         </GridPane.margin>
         <padding>
            <Insets bottom="30.0" left="10.0" right="10.0" top="30.0" />
         </padding></TextFlow>

设置加载器映像的代码如下所示;

//Set up the product preview image loader
BufferedImage bufferedImage;
File file = new File("resources\\images\\loaders\\img-loader-icon.gif");
try {
bufferedImage = ImageIO.read(file);
   productPreviewLoader.setImage(SwingFXUtils.toFXImage(bufferedImage, null));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
productPreviewLoader.setVisible(false);

图像不会在ImageView中播放。如果不可能,请告诉我另一种方法。此外,我在使ImageView在GridPane行中水平居中时遇到了一个问题。每当调整窗口大小时,GridPane都会调整大小以匹配其父窗口的高度。我知道这是两个问题,但我可能最终会提出两个问题。

共有1个答案

毋城
2023-03-14

您还没有提供一个完整的示例,我可以用它来展示如何将gif图像加载到ImageView的用例,因此我将给您一个完整的示例:

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class GifViewerTest extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {

        VBox box = new VBox();
        ImageView imageView = new ImageView();

        box.getChildren().add(imageView);

        Button localLoadButton = new Button("Local load");
        Button externalLoadButton = new Button("URL Load");

        localLoadButton.setOnAction(e -> {
            imageView.setImage(new Image(this.getClass().getResource("java.gif").toExternalForm()));
        });

        externalLoadButton.setOnAction(e -> {
            String imageSource = "https://cdn.dribbble.com/users/550761/screenshots/1773241/untitled-5.gif";
            try {
                imageView.setImage(createImage(imageSource));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        });

        FlowPane buttonPane = new FlowPane();
        buttonPane.setAlignment(Pos.CENTER);
        buttonPane.getChildren().addAll(localLoadButton, externalLoadButton);

        box.getChildren().add(buttonPane);

        stage.setScene(new Scene(box, 500, 400));
        stage.show();
    }

    private Image createImage(String url) throws IOException {
        // You have to set an User-Agent in case you get HTTP Error 403
        // respond while you trying to get the Image from URL.
        URLConnection conn = new URL(url).openConnection();
        conn.setRequestProperty("User-Agent", "Wget/1.13.4 (linux-gnu)");

        try (InputStream stream = conn.getInputStream()) {
            return new Image(stream);
        }
    }
}

如果您的所有图像都是通过URL加载的,那么您为什么不使用WebViewer并加载URL而不是使用ImageView呢?如果gif大小不小,这将导致GUI延迟,直到从InputStream加载gif图像在这种情况下,您应该创建加载过程到后台线程,但正如我所说,如果您只使用WebViewer,您可以避免所有这些。

 类似资料:
  • 本文向大家介绍Unity3D实现播放gif图功能,包括了Unity3D实现播放gif图功能的使用技巧和注意事项,需要的朋友参考一下 Unity是不识别Gif格式图的,需要我们使用c#将gif里多帧图转化为Texture2D格式。需要使用System.Drawing.dll.此dll在unity安装目录下就可以找到。由于unity没有gif格式的文件,所以我们无法在面板指定,需要动态加载。所以将gi

  • 我想在JavaFX的ImageView中显示图像。图像应该从SQLite数据库中获取,并在场景加载时显示。我使用以下代码片段从数据库获取代码,并在之前创建的ImageView中显示它。但是图像没有按预期显示。我做错了吗?P. S.我测试了改变路径在两个和当读取文件从目录到。但似乎没有什么奏效。但是当我手动将一个图像文件放在src目录中并尝试读取它时,它就像一个魅力。但是我想展示一张从数据库中提取的

  • 问题内容: 我想使用python3和tkinter创建一个虚拟的宠物风格游戏。到目前为止,我已经有了主窗口并开始放入标签,但是我遇到的问题是播放动画gif。我在这里搜索并找到了一些答案,但是他们不断抛出错误。我发现使用PhotoImage的结果具有gif的索引位置,并在一定范围内继续。 当我在终端中使用“ pyhton3 main.py”运行此命令时,出现以下错误: _tkinter.TclErr

  • 我想问一下,是否有人知道JavaFX ImageView如何处理图像清理。当图像对象/内存空闲时。 以下是给我带来问题的情况:我的场景中有两个“标签”。这是我的标签:在父窗格中的按钮和切换窗格。每个选项卡都有自己的ImageView。在切换窗格之前,我先在旧ImageView上设置空图像,然后加载新图像。我原以为在切换标签后,旧图像从旧图像视图将是免费的,但事实并非如此。 为了监控行为,我使用Ja

  • 我第一次使用Glide在ImageView中显示GIF。我已经按照几个站点的方式对其进行了编码。但它不起作用。我已经给出了以下所有代码:(如果我弄错了什么,请告诉我) 项目级build.gradle 应用程序级构建。gradle文件: activity_main.xml 活动Java代码: 单击“提交”按钮后,我没有看到GIF图像。

  • 本文向大家介绍用Python将动态GIF图片倒放播放的方法,包括了用Python将动态GIF图片倒放播放的方法的使用技巧和注意事项,需要的朋友参考一下 这次让我们一个用 Python 做一个小工具:将动态 GIF 图片倒序播放! GIF(Graphics Interchange Format) 是一种可以用来呈现动画效果的图片格式,原理就是保存很多帧(Frame)静态图像,然后连续呈现。很多简短的