2016-01-18 70 views
1

我打算通過在for循環中向時間軸對象添加關鍵幀來更改鳥類的圖像。事實證明,只顯示第一個圖像。有人能指出我哪裏錯了嗎?提前致謝。如何使用JavaFX中的時間線更改圖像

此外,我注意到我必須在for循環後將計數器「index」重置爲0,否則它會生成java.lang.ArrayIndexOutOfBoundsException。

包應用;

import javafx.animation.Animation; 
import javafx.animation.KeyFrame; 
import javafx.animation.KeyValue; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.stage.Stage; 
import javafx.util.Duration; 
import javafx.scene.Group; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.effect.BoxBlur; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.StackPane; 

public class Main extends Application 

{

int index=0; 
@Override 
public void start(Stage primaryStage) { 
    try { 

     ImageView bgV = new ImageView(); 
     Image img_BG = new Image(Main.class.getResourceAsStream("background.png")); 
     bgV.setImage(img_BG); 
     bgV.setEffect(new BoxBlur()); 
     bgV.setOpacity(0.5); 

     ImageView t1V = new ImageView(); 
     Image img_t1 = new Image(Main.class.getResourceAsStream(
       "t1.png" 
       )); 
     t1V.setImage(img_t1); 

     ImageView t2V = new ImageView(); 
     Image img_t2 = new Image(Main.class.getResourceAsStream(
       "t2.png" 
       )); 
     t2V.setImage(img_t2); 

     ImageView t3V = new ImageView(); 
     Image img_t3 = new Image(Main.class.getResourceAsStream(
       "t3.png" 
       )); 
     t3V.setImage(img_t3); 

     Group foreground = new Group(t1V,t2V,t3V); 

     t1V.setTranslateX(20); 
     t1V.setTranslateY(200); 

     t2V.setTranslateX(300); 
     t2V.setTranslateY(200); 

     t3V.setTranslateX(550); 
     t3V.setTranslateY(200); 
     foreground.setEffect(new DropShadow()); 

     String[] 
       birdFiles = {"b1.png", "b2.png", "b3.png", "b4.png", "b5.png", "b6.png"}; 
     double[] ds = { 300,   600,    900,   1200, 1500, 1800}; 

     ImageView birdV = new ImageView(new Image(Main.class.getResourceAsStream(birdFiles[0]))); 
     Group birds = new Group(birdV); 
     birds.setTranslateX(img_BG.getWidth()-100); 

     Timeline timeline = new Timeline(); 
     timeline.setCycleCount(
       Animation.INDEFINITE 
       ); 


     KeyFrame[] kframs = new KeyFrame[birdFiles.length]; 

     for(index=0; index<birdFiles.length; index++) 
     { 
      EventHandler<ActionEvent> 
       onFishined = new EventHandler<ActionEvent>() 
      { 

       @Override 
       public void handle(ActionEvent arg0) 
       { 
        birds.getChildren().setAll(new ImageView(new Image(Main.class.getResourceAsStream(birdFiles[index])))); 

       } 

      }; 
      Duration duration = Duration.millis(ds[index]); 
      KeyFrame 
       kf = new KeyFrame(duration, onFishined,null,null ); 
      timeline.getKeyFrames().add(kf); 

     }//End for i 
     index = 0; 







     timeline.play(); 





     Group root = new Group(bgV,foreground,birds); 

     Scene scene = new Scene(root,img_BG.getWidth(), img_BG.getHeight()); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

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

}

+0

參見相關:【如何顯示在JavaFX的圖像的特定部分(http://stackoverflow.com/questions/23440980/how-show-specific-image-in-javafx)和[用JavaFX創建Sprite動畫](http://blog.netopyr.com/2012/03/09/creating-a -sprite-animation-with-javafx /) – jewelsea

回答

1

你不必外聲明的index - 場。這也會導致你的問題:無論何時調用handle方法,它都會引用你的字段:index,你在循環後將其設置爲0。

爲此你可以宣佈一個新的領域作爲final並把它傳遞到處理程序:

for (int index = 0; index < birdFiles.length; index++) { 
    final int birdIndex = index; 
    EventHandler<ActionEvent> onFishined = new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent arg0) { 
        birds.getChildren().setAll(new ImageView(new Image(Main.class.getResourceAsStream(birdFiles[birdIndex])))); 
       } 

      }; 
    ... 
} 
+0

非常感謝,KnusperPudding,它確實解決了問題 – user1304846

相關問題