gpt4 book ai didi

JavaFX 在 ImageView 中播放 gif 图像

转载 作者:行者123 更新时间:2023-11-30 06:27:05 25 4
gpt4 key购买 nike

我看到这个问题被问了很多,但我还没有看到一个非常通用的方法。我正在使用 JavaFX 在 Java Eclipse Oxygen 中开发桌面应用程序,并且我有一个加载程序,我想在图像通过 http 加载时随时显示它。当用户单击不同的行时,必须通过 http 加载图像。所以我将加载程序放在图像顶部,然后使用; productPreviewLoader.setVisible(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 都会调整大小以匹配其父级的高度。我知道这是 2 个问题,但我可能最终会提出 2 个问题。

最佳答案

好吧,您还没有提供一个完整的示例,我可以使用它来展示如何将 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,则可以避免这一切。

关于JavaFX 在 ImageView 中播放 gif 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com