2014-06-18 3 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); 
    } 
} 

Notifier Класс:

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. Чтобы достичь того же представления, что и в случае мгновенного обновления, используйте анимацию/timeline.setonFinished (EventHandler()) для обновления экрана

Смежные вопросы