2016-03-08 65 views
0

我想逐个随机显示我的图像。下面的代码来显示图像逐个只有如果我把持续时间(秒),如:在幻灯片中逐个显示随机图像

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

所以,我的代码将显示图像1 firstn图像2秒,图像3三分之二等。

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

你是什么意思“每次”? – KWeiss

+0

@KWeiss当我运行这段代码时,我想一个接一个地随机显示图像。 – dailyadd

+1

你为什么要让所有的时间点都一样? –

回答

2

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

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

因为我们每次洗牌,可能的是最后的图像显示的进行改组是在下一周期的第一图像(在一行中显示它两次)。如果您不想在两个循环之间更改订单,只需删除时间结束后执行的shuffle命令。

注意,为了简单起见,代码使用impl_getUrl()向控制台输出显示图像URL的日志 - 在生产代码中不推荐使用impl方法。

+0

基本上,我问的是将我的图像放在一个数组中,所以我可以将它们洗牌,这个过程应该基于我的代码进行。不要给我一个例子,这个例子在我的问题的解决方案中只贡献了10%,因为我可以在Google中找到这些例子。 – dailyadd

+0

不,你的问题是“逐个显示随机图像”,这就是这个答案的作用。我不相信这是一个10%的解决方案,它似乎能够解决完整的问题给我。请注意,此解决方案确实将图像放入数组列表中,并将其作为解决问题的一部分进行混洗。如果我误解了我对这个问题的理解,或者答案对您是不可接受的,那么最好忽略这个答案。 – jewelsea

+0

是的,你可以看到我的代码超出了我粘贴的内容,如果你没有注意到的话。你在这里似乎很老,但你可能错过了这个页面的要点。让我告诉你。 stackoverflow.com不是提供提示,而是提供解决方案。 – dailyadd

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