JavaFX

2013-07-08 14 views
5

'daki ImageView geçişi için zaten How to wait for a transition to end in javafx 2.1?'a baktım ama sorunumu tam olarak çözmüyor.JavaFX

Ben ImageView nesneleri listesi var ve bu Listesi üzerinden yineleme ve Listesi'nin her 'slayt' aşağıdaki eylemleri gerçekleştirmek istediğiniz: birkaç saniye

  1. solma kalmak
  2. yılında
  3. karartmak

Ben yerinde ancak geçiş asenkron olduğundan, döngü aynı anda tüm 'slaytlar' geçişi geçerlidir kod aşağıdadır:

// The method I am running in my class 

public void start() { 

    for (ImageView slide : slides) { 

     SequentialTransition sequentialTransition = new SequentialTransition(); 

     FadeTransition fadeIn = Transition.getFadeTransition(slide, 0.0, 1.0, 2000); 
     FadeTransition stayOn = Transition.getFadeTransition(slide, 1.0, 1.0, 2000); 
     FadeTransition fadeOut = Transition.getFadeTransition(slide, 1.0, 0.0, 2000); 

     sequentialTransition.getChildren().addAll(fadeIn, stayOn, fadeOut);    
     this.root.getChildren().add(slide);    
     sequentialTransition.play(); 

    } 
} 

// the method in the Transition helper class: 

public static FadeTransition getFadeTransition(ImageView imageView, double fromValue, double toValue, int durationInMilliseconds) { 

    FadeTransition ft = new FadeTransition(Duration.millis(durationInMilliseconds), imageView); 
    ft.setFromValue(fromValue); 
    ft.setToValue(toValue); 

    return ft; 

} 

I (bakılmaksızın Listesinde bulunmaktadır ImageViews sayısının, bu yüzden sert kod bunu istemiyoruz) ImageView bu Listesi tek tek nesneleri canlandırabilirsiniz nasıl bir fikir. Teşekkürler.

cevap

4

Yani, bu sarih düzeltme, bu Geçişler oynar senin SequentialTransitions için çevredeki SequentialTransition kullanmak olacaktır kuyu, sırayla yerine hepsinden aynı anda:

public void start() { 

    SequentialTransition slideshow = new SequentialTransition(); 

    for (ImageView slide : slides) { 

     SequentialTransition sequentialTransition = new SequentialTransition(); 

     FadeTransition fadeIn = Transition.getFadeTransition(slide, 0.0, 1.0, 2000); 
     FadeTransition stayOn = Transition.getFadeTransition(slide, 1.0, 1.0, 2000); 
     FadeTransition fadeOut = Transition.getFadeTransition(slide, 1.0, 0.0, 2000); 

     sequentialTransition.getChildren().addAll(fadeIn, stayOn, fadeOut);    
     this.root.getChildren().add(slide);    
     slideshow.getChildren().add(sequentialTransition); 

    } 
    slideshow.play(); 
} 

İkinci, sen yerine PauseTransition kullanmalıdır 1.0 ila 1.0 arasında bir enterpolasyon yapan bir FadeTransition.

bu tam bir örnek uygulama bu gibi görünebilir:

package slideshow; 

import javafx.animation.FadeTransition; 
import javafx.animation.PauseTransition; 
import javafx.animation.SequentialTransition; 
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; 

public class SimpleSlideShowTest extends Application{ 

    class SimpleSlideShow { 

    StackPane root = new StackPane(); 
    ImageView[] slides; 

    public SimpleSlideShow() { 
     this.slides = new ImageView[4]; 
     Image image1 = new Image(SlideShowTest.class.getResource("pic1").toExternalForm()); 
     Image image2 = new Image(SlideShowTest.class.getResource("pic2").toExternalForm()); 
     Image image3 = new Image(SlideShowTest.class.getResource("pic3").toExternalForm()); 
     Image image4 = new Image(SlideShowTest.class.getResource("pic4").toExternalForm()); 
     slides[0] = new ImageView(image1); 
     slides[1] = new ImageView(image2); 
     slides[2] = new ImageView(image3); 
     slides[3] = new ImageView(image4); 

    } 

    public StackPane getRoot() { 
     return root; 
    } 

    // The method I am running in my class 

    public void start() { 

     SequentialTransition slideshow = new SequentialTransition(); 

     for (ImageView slide : slides) { 

     SequentialTransition sequentialTransition = new SequentialTransition(); 

     FadeTransition fadeIn = getFadeTransition(slide, 0.0, 1.0, 2000); 
     PauseTransition stayOn = new PauseTransition(Duration.millis(2000)); 
     FadeTransition fadeOut = getFadeTransition(slide, 1.0, 0.0, 2000); 

     sequentialTransition.getChildren().addAll(fadeIn, stayOn, fadeOut); 
     slide.setOpacity(0); 
     this.root.getChildren().add(slide); 
     slideshow.getChildren().add(sequentialTransition); 

     } 
     slideshow.play(); 
    } 

// the method in the Transition helper class: 

    public FadeTransition getFadeTransition(ImageView imageView, double fromValue, double toValue, int durationInMilliseconds) { 

     FadeTransition ft = new FadeTransition(Duration.millis(durationInMilliseconds), imageView); 
     ft.setFromValue(fromValue); 
     ft.setToValue(toValue); 

     return ft; 

    } 
    } 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
    SimpleSlideShow simpleSlideShow = new SimpleSlideShow(); 
    Scene scene = new Scene(simpleSlideShow.getRoot()); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    simpleSlideShow.start(); 
    } 
} 
+0

Teşekkür Sebastian! :) Bunu denemedim (eve geldiğimde yapacağım) ama mantıklı geliyor .. ben çok aptalım .. çok teşekkürler! :) Eve döndüğümde seni güncelleyeceğim .. –

+0

Sorun değil. Eğer ekleyebilirsem, Timer ve TimerTask'ı JavaFX'ten başka bir sonraki slaytları tetiklemeyi tercih ederim, çünkü bu daha iyi ölçekler. Birkaç hafta önce kendim için bir slayt gösterisi yazdım, düğmeler ekledim ve slayt gösterisini durdurmak, uygulamanıza daha sonra eklemek isteyebileceğiniz bir şey. – Sebastian

+0

Merhaba Bastian, önerdiğin çözümü denedim ve maalesef hile yapmıyor. Kodu çalıştırdığımda, sadece listenin son slaydını görüyorum .. ön yüzünü gösterir ve sonra ekran kaybolur ve ekran boş bırakılarak kaybolur. Bence burada olmayan her slayt için geçiş oynamalıyım. Çok teşekkürler :) –