2014-10-19 8 views
5

으로 계속 진행하십시오. 기본적으로 JavaFX를 사용하여 짧은 효과를 얻으려고합니다. 나는 double 값 p을 사용하여 크기가 변할 수있는 두 개의 원과 다각형에서 함께 추가 된 하트 모양을가집니다. "표준 크기"는 p = 1.0;입니다.JavaFX를 기다려 코드

나는 심장에 펌핑 효과를 추가하려고합니다.

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

initHeart()p에 따라 마음을 그립니다 : 나는 방법 pumpOnce() 있습니다.

나는 Thread.sleep(); 또는 유사한 방법이 JavaFX의 스레드 철학 때문에 작동하지 않는다는 것을 발견했습니다.

대신 무엇을 사용할 수 있습니까?

+0

'KeyFrame'과 함께 '일시 중지'또는 '타임 라인'을 사용하면 더 복잡한/맞춤 애니메이션 전환을 만들 수 있습니다. –

+0

그래, 나는 Uluk 어딘가에서 네 답을 보았지만, 정말로 전환을하려고하지는 않았지만 근본적으로 두 프레임 애니메이션이었다. Thread.sleep()과 비슷한'Timeline'을 사용할 수 있습니까? – Maverick283

+1

'PauseTransition'은 노드와 연관 될 필요가 없습니다. 당신은 하나를 만들고, 멈춤 후에 코드가 실행될 수 있도록'setOnFinished' 핸들러를 사용하고,'play()'를 호출하여 그것을 시작시킬 수 있습니다. –

답변

10

JavaFX 애니메이션이 가장 좋은 방법 일 것입니다.하지만 JavaFX의 "스레드 철학"은 백그라운드 스레드에서 직접 또는 다른 복잡한 작업을 수행하려는 경우 어렵지 않습니다.

일시 정지 (전체 공개, 내가 또 다른 질문에 대한 쓴 코드를 재사용하고있어) 레이블의 값을 변경합니다 다음 코드 :

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

기본 자바 FX 배경 도구 작업, 어떤 자바 FX는 실제로 아무것도 수행하는 응용 프로그램은 아마도 이러한 모든 것들로 산재 해있을 것입니다. 그것들을 사용하는 방법을 배우십시오.

3

데이브의 솔루션은 JavaFX에서 스레드 기반 작업을 수행하는 일반 용도에 적합합니다.

JavaFX의 애니메이션 기능을 사용하려는 경우 아래 솔루션에서 타임 라인 또는 ScaleTransition을 사용하여이를 보여줍니다. 타임 라인은 UI 요소의 개별 축척을 구현하므로 UI ​​요소가 1/4 초마다 커지거나 원래 크기로 돌아갑니다. 축척 전환은 UI 요소의 부드러운 축척을 구현하므로 default easing interpolator이있는 보간 된 축척 계수를 사용하여 UI 요소가 서서히 커집니다.

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. 
}