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

时间:2016-03-08 13:50:29

标签: java javafx

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

 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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

 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))
            );

答案 1 :(得分:2)

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

    tasks = [
            fetch(session, 'http://cnn.com'),
            fetch(session, 'http://google.com'),
            fetch(session, 'http://twitter.com')
            ]

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

注意,为简单起见,代码使用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<Image> images; private Iterator<Image> 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://icons.iconarchive.com/icons/fasticon/fish-toys/128/Blue-Fish-icon.png", "http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Red-Fish-icon.png", "http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Yellow-Fish-icon.png", "http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Green-Fish-icon.png" }; } 将显示的图像URL的日志输出到控制台 - 不建议在生产代码中使用impl方法。