2014-10-19 9 views
5

Temelde JavaFX kullanarak kısa bir etki yapmaya çalışıyorum. p çift değerini kullanarak boyut olarak değiştirebileceğiniz bir kalbin (iki daireden ve bir poligondan bir araya getirilmiş) şekli var. "Standart Boyut" p = 1.0; olacaktır.JavaFX'i bekleyin ve kodla devam edin

Kalbe bir pompa efekti eklemeyi deniyorum.

public void pumpOnce(){ 
    p = p + 1; 
    initHeart(); 
    //Here goes what ever it takes to make stuff working!! 
    p = p - 1; 
    initHeart(); 
} 

initHeart()p dayalı kalbini çizer: Ben yöntemini pumpOnce() var.

Thread.sleep(); veya benzeri yöntemlerin JavaFX'teki iş parçacığı felsefesi nedeniyle işe yaramayacağını öğrendim.

Fakat bunun yerine ne kullanabilirim?

+0

Daha karmaşık/özel animasyon geçişleri oluşturmak için 'PauseTransition' veya' Timeline' '' KeyFrame's ile kullanabilirsiniz. –

+0

Evet, Uluk çevresinde bir yerinizin cevabını gördüm, ama gerçekten bir geçiş yapmaya çalışmıyorum, ama aslında iki çerçeve animasyonu. Thread.sleep() 'ile benzer' Timeline' kullanabilir miyim? – Maverick283

+1

A 'PauseTransition''ın bir düğümle ilişkilendirilmesi gerekmez. Sadece bir tane oluşturabilir, "setOnFinished" işleyicisini duraklamadan sonra yürütecek kod için kullanabilirsiniz ve başlatmak için play() 'yi çağırın. –

cevap

10

JavaFX animasyonları büyük olasılıkla yoldan gitmektedir, ancak JavaFX'teki "iş parçacığı felsefesi", kendi başınızı döndürmek veya arka plan iş parçacıklarında diğer karmaşık işlemler yapmakta zorlanmamaktadır.

duraklatma ve (tam açıklama, ben başka bir soru için yazdığı kod yeniden ediyorum) bir etiket değeri değişecek Aşağıdaki kod:

import javafx.application.Application; 
import javafx.concurrent.Task; 
import javafx.concurrent.WorkerStateEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class HelloWorld extends Application { 

    private static Label label; 

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

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Hello World!"); 
     label = new Label(); 
     label.setText("Waiting..."); 
     StackPane root = new StackPane(); 
     root.getChildren().add(label); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 

     Task<Void> sleeper = new Task<Void>() { 
      @Override 
      protected Void call() throws Exception { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
       } 
       return null; 
      } 
     }; 
     sleeper.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
      @Override 
      public void handle(WorkerStateEvent event) { 
       label.setText("Hello World"); 
      } 
     }); 
     new Thread(sleeper).start(); 
    } 
} 

temel JavaFX arkaplan aracı Görev, herhangi JavaFX olduğunu Aslında her şeyi yapan bir uygulama muhtemelen her şeyden önce bunlarla dolu olacak. Bunları nasıl kullanacağınızı öğrenin.

3

Dave'in çözümü, JavaFX'deki genel amaçlı iş parçacığı tabanlı çalışmalar için mükemmeldir.

JavaFX'in animasyon özelliklerini kullanmak isterseniz, aşağıdaki çözümler bunu bir Zaman Çizelgesi veya ScaleTransition kullanarak gösterir. Zaman çizelgesi, UI elemanının ayrı bir ölçeğini uygular, bu nedenle UI elemanının her çeyreğinin her çeyreği daha büyük veya orijinal boyutuna geri ölçeklenir. Ölçek geçişi, UI elemanının pürüzsüz bir ölçeğini uygular, bu nedenle UI elemanı, daha sonra, daha sonra, daha küçük olan ve default easing interpolator ile enterpolasyonlu bir ölçek faktörü kullanarak daha küçük hale gelir.

import javafx.animation.*; 
import javafx.application.Application; 
import javafx.beans.property.*; 
import javafx.scene.Scene; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class BeatingHeart extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public void start(Stage stage) { 
     ImageView heart = new ImageView(HEART_IMAGE_LOC); 

     animateUsingTimeline(heart); 
//  animateUsingScaleTransition(heart); 

     StackPane layout = new StackPane(heart); 
     layout.setPrefWidth(heart.getImage().getWidth() * 2); 
     layout.setPrefHeight(heart.getImage().getHeight() * 2); 

     Scene scene = new Scene(layout); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private void animateUsingTimeline(ImageView heart) { 
     DoubleProperty scale = new SimpleDoubleProperty(1); 
     heart.scaleXProperty().bind(scale); 
     heart.scaleYProperty().bind(scale); 

     Timeline beat = new Timeline(
      new KeyFrame(Duration.ZERO,   event -> scale.setValue(1)), 
      new KeyFrame(Duration.seconds(0.5), event -> scale.setValue(1.1)) 
     ); 
     beat.setAutoReverse(true); 
     beat.setCycleCount(Timeline.INDEFINITE); 
     beat.play(); 
    } 

    private void animateUsingScaleTransition(ImageView heart) { 
     ScaleTransition scaleTransition = new ScaleTransition(
      Duration.seconds(1), heart 
     ); 
     scaleTransition.setFromX(1); 
     scaleTransition.setFromY(1); 
     scaleTransition.setFromZ(1); 
     scaleTransition.setToX(1.1); 
     scaleTransition.setToY(1.1); 
     scaleTransition.setToZ(1.1); 
     scaleTransition.setAutoReverse(true); 
     scaleTransition.setCycleCount(Animation.INDEFINITE); 
     scaleTransition.play(); 
    } 

    private static final String HEART_IMAGE_LOC = 
      "http://icons.iconarchive.com/icons/mirella-gabriele/valentine/128/Heart-red-icon.png"; 
    // icon obtained from: http://www.iconarchive.com/show/valentine-icons-by-mirella-gabriele/Heart-red-icon.html 
    // icon license: Free for non-commercial use, commercial use not allowed. 
}