2014-06-18 1 views
1

최근에 JavaFX로 놀기 시작했습니다. 저는 작은 애완 동물 프로젝트에서 일하고 있습니다. 현재 내가 겪고있는 문제 중 하나는 VBox의 크기를 애니메이션 할 때입니다. VBox에서 /로 자식이 추가되거나 제거됩니다.애니메이션 VBox 자식 추가 또는 제거시 크기 조정

"아이들"이 사라지고 VBox에서 이미 제거되었습니다. 일단 애니메이션이 완성되면 VBox 높이를 애니메이션처럼 크기를 조정하고 현재의 변경 사항처럼하지 않는 것이 좋습니다.

내가 찾은 다른 스레드는 비슷하지만 실제로 찾고있는 스레드가 아닌 것 같습니다.
Animation upon layout changes
Adding Node's animated to a VBox

메인 클래스 :

package application; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.KeyCombination; 
import javafx.scene.paint.Color; 
import application.notifier.*; 

public class Main extends Application 
{ 
    @Override 
    public void start(Stage stage) 
    { 
     try 
     { 
      stage.setTitle("Test"); 
      Group root = new Group(); 
      Scene scene = new Scene(root, (Screen.getPrimary().getBounds().getWidth()-100), (Screen.getPrimary().getBounds().getHeight()-100), Color.WHITE); 

      Notifier notice = new Notifier(); 

      Notifier.addNotice("Testing Add Notice"); 
      Notifier.addNotice("Testing Add Notice again!"); 

      root.getChildren().add(Notifier.container); 

      stage.setFullScreen(true); 
      stage.setScene(scene); 
      stage.setFullScreenExitHint(""); 
      //stage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH); 
      stage.show(); 

      Button test = new Button("Remove"); 
      test.setLayoutX(500.0); 
      test.setLayoutY(500.0); 

      test.setOnAction(new EventHandler<ActionEvent>() { 
       @Override public void handle(ActionEvent e) { 
       Notifier.removeNotice(); 
      } 
      }); 

      root.getChildren().add(test); 


     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

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

알리미 등급 :

import java.util.ArrayList; 

import javafx.animation.FadeTransition; 
import javafx.animation.Timeline; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.CornerRadii; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Text; 
import javafx.stage.Screen; 
import javafx.util.Duration; 

public class Notifier 
{ 
    private static int maxVisibleNotices = 5; 
    private static int currentVisible = 0; 

    private static ArrayList<String> msgOverflow; 

    public static VBox container; 

    public Notifier() 
    { 
     BackgroundFill bkgrndFill = new BackgroundFill(Color.rgb(0, 0, 0, .65), new CornerRadii(10.0), new Insets(0)); 
     Background bkgrnd = new Background(bkgrndFill); 

     Notifier.container = new VBox(); 
     Notifier.container.backgroundProperty().set(bkgrnd); 
     Notifier.container.setAlignment(Pos.TOP_CENTER); 
     Notifier.container.setMinWidth(Screen.getPrimary().getBounds().getWidth() - 50); 
     Notifier.container.setMaxWidth(Screen.getPrimary().getBounds().getWidth() - 50); 
     Notifier.container.setLayoutX((Screen.getPrimary().getBounds().getWidth() - (Screen.getPrimary().getBounds().getWidth() - 50))/2); 
     Notifier.container.setLayoutY(5.0); 
     Notifier.container.setSpacing(5.0); 
     Notifier.container.setPadding(new Insets(5.0)); 

     Notifier.msgOverflow = new ArrayList<String>(); 
    } 

    public static void addNotice(String msg) 
    { 
     if(Notifier.currentVisible < Notifier.maxVisibleNotices) 
     { 
      Text txt = new Text(msg); 
      txt.setFill(Color.rgb(255,255,255)); 

      Notifier.container.getChildren().add(txt); 
      Notifier.currentVisible++; 
     } 
     else 
     { 
      Notifier.msgOverflow.add(msg); 
     } 
    } 

    public static void removeNotice() 
    { 
     if(Notifier.currentVisible > 0) 
     { 
      FadeTransition ft = new FadeTransition(Duration.millis(1000), Notifier.container.getChildren().get(0)); 
      ft.setFromValue(1.0); 
      ft.setToValue(0.0); 
      ft.setCycleCount(0); 
      ft.setAutoReverse(false); 
      ft.play(); 

      ft.setOnFinished(new EventHandler<ActionEvent>() { 
       @Override public void handle(ActionEvent e) { 
        Notifier.container.getChildren().remove(0); 
        Notifier.currentVisible--; 
       } 
      });  
     } 
    } 
} 

나는이 충분히 명확 바랍니다. 도움이나 제안에 미리 감사드립니다.

답변

1

아마 더 이상 도움이되지 않을 것입니다. 나는 현재 같은 일을하고있다.
당신은 단지 다음을 필요로합니다 :
1. VBox에 남아있는 각각의 자식들에게 같은 애니메이션을 추가하십시오.
2. ParallelAnimation을 사용하여 동시에 실행합니다.
3. SequentialAnimation을 다시 사용하여 애니메이션과 병렬 애니메이션을 페이드 아웃하는 "키즈"를 만듭니다. 이렇게하면 여러 스레드가 동시에 실행될 수 있기 때문에 동시에 발생하지 않습니다.
4. 인스턴트 업데이트와 동일한보기를 유지하려면 animation/timeline.setonFinished (EventHandler())를 사용하여 화면을 업데이트하십시오.

관련 문제