时间轴在幻灯片中逐个显示随机图像

我想逐个随机显示我的图像。 以下代码仅在我将持续时间以秒为单位时逐个显示图像:

new KeyFrame(Duration.seconds(1), new KeyValue(imageView.imageProperty(), image1)), new KeyFrame(Duration.seconds(2), new KeyValue(imageView.imageProperty(), image2)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image3)), new KeyFrame(Duration.seconds(4), new KeyValue(imageView.imageProperty(), image4)), 

所以,我的代码将显示image1 firstn image 2 second,image3 thirds等等。

1)我希望它每次都能显示随机图像。
2)不依赖于持续时间。 因为如果我将Duration.seconds(3)放到所有这些中,它将只显示第一个。

代码如下所示:

 package imagedisplayy; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.util.Duration; /** * * @author D */ public class ImageDisplayy extends Application { @Override public void start(Stage primaryStage) { Image image1 = new Image("file:lib/1.jpg"); Image image2 = new Image("file:lib/2.jpg"); Image image3 = new Image("file:lib/3.jpg"); Image image4 = new Image("file:lib/4.jpg"); ImageView imageView = new ImageView(); Timeline timeline = new Timeline( new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image1)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image2)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image3)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image4)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), null)) ); timeline.play(); StackPane root = new StackPane(); root.getChildren().add(imageView); primaryStage.setScene(new Scene(root, 800, 600)); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

这是一个基于数组的解决方案,循环显示随机选择的图像。 arrays中的所有图像将以随机顺序显示一次,然后arrays将被混洗,允许所有图像以不同的随机顺序再次显示。

 import javafx.animation.*; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.*; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.util.Duration; import java.util.*; import java.util.stream.Collectors; public class ImageDisplay extends Application { private List images; private Iterator imageIterator; @Override public void start(Stage stage) { images = Arrays.stream(IMAGE_LOCS) .map(Image::new) .collect(Collectors.toList()); Collections.shuffle(images); imageIterator = images.iterator(); ImageView imageView = new ImageView(); Timeline timeline = new Timeline( new KeyFrame( Duration.ZERO, e -> { imageView.setImage(imageIterator.next()); System.out.println( "Displaying " + imageView.getImage().impl_getUrl() ); } ), new KeyFrame(Duration.seconds(1)) ); timeline.setCycleCount(images.size()); timeline.setOnFinished(event -> { Collections.shuffle(images); imageIterator = images.iterator(); timeline.playFromStart(); }); timeline.play(); StackPane layout = new StackPane(imageView); stage.setScene(new Scene(layout)); stage.show(); } public static void main(String[] args) { launch(args); } // image license: linkware - backlink to http://www.fasticon.com private static final String[] IMAGE_LOCS = { "http://sofzh.miximages.com/java/Blue-Fish-icon.png", "http://sofzh.miximages.com/java/Red-Fish-icon.png", "http://sofzh.miximages.com/java/Yellow-Fish-icon.png", "http://sofzh.miximages.com/java/Green-Fish-icon.png" }; } 

因为我们每次都进行随机播放,所以显示的最后一个图像可能被混洗成下一个周期的第一个图像(连续两次显示)。 如果您不希望在循环之间更改顺序,只需删除时间完成播放时执行的随机播放命令。

请注意,为简单起见,代码使用impl_getUrl()将显示的图像URL的日志输出到控制台 – 不建议在生产代码中使用impl方法。

在您的堆栈窗格中,它表示持续三秒钟显示所有四个图像,您需要逐个显示它们。 更改

  new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image1)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image2)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image3)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image4)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), null)) ); 

  new KeyFrame(Duration.ZERO, new KeyValue(imageView.imageProperty(), image1)), new KeyFrame(Duration.seconds(1), new KeyValue(imageView.imageProperty(), image2)), new KeyFrame(Duration.seconds(2), new KeyValue(imageView.imageProperty(), image3)), new KeyFrame(Duration.seconds(3), new KeyValue(imageView.imageProperty(), image4)), new KeyFrame(Duration.seconds(4), new KeyValue(imageView.imageProperty(), null)) );