2014-01-13 25 views
2

前幾天我開始學習JavaFX,並且遇到了執行2個實驗的願望。首先,我想知道是否可以在用戶界面後面放置動畫背景。我成功創建了一個動畫背景,現在我很難在界面中間放置一些控件。JavaFX 2.X - 動畫背景和動畫控件

我想向您介紹我的程序的2張圖片。首先表明,我得到了不希望的結果:

Wrong result.

我相信這是我的節點樹:

Nodes tree

這是我的應用程序的代碼:

public class AnimatedBackground extends Application 
{ 
// ######################################################################################################### 
//                          MAIN 
// ######################################################################################################### 

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

// ######################################################################################################### 
//                        INSTÂNCIAS 
// ######################################################################################################### 

private Group root; 
private Group grp_hexagons; 
private Rectangle rect_background; 
private Scene cenario; 

// UI 

private VBox lay_box_controls; 

private Label lab_test; 
private TextArea texA_test; 
private Button bot_test; 

// ######################################################################################################### 
//                         INÍCIO FX 
// ######################################################################################################### 

@Override public void start(Stage stage) throws Exception 
{ 
    this.confFX(); 

    cenario = new Scene(this.root , 640 , 480); 

    this.rect_background.widthProperty().bind(this.cenario.widthProperty()); 
    this.rect_background.heightProperty().bind(this.cenario.heightProperty()); 

    stage.setScene(cenario); 
    stage.setTitle("Meu programa JavaFX - R.D.S."); 
    stage.show(); 
} 

protected void confFX() 
{ 
    this.root = new Group(); 
    this.grp_hexagons = new Group(); 

    // Initiate the circles and all animation stuff. 
    for(int cont = 0 ; cont < 15 ; cont++) 
    { 
     Circle circle = new Circle(); 
     circle.setFill(Color.WHITE); 
     circle.setEffect(new GaussianBlur(Math.random() * 8 + 2)); 
     circle.setOpacity(Math.random()); 
     circle.setRadius(20); 

     this.grp_hexagons.getChildren().add(circle); 

     double randScale = (Math.random() * 4) + 1; 

     KeyValue kValueX = new KeyValue(circle.scaleXProperty() , randScale); 
     KeyValue kValueY = new KeyValue(circle.scaleYProperty() , randScale); 
     KeyFrame kFrame = new KeyFrame(Duration.millis(5000 + (Math.random() * 5000)) , kValueX , kValueY); 

     Timeline linhaT = new Timeline(); 
     linhaT.getKeyFrames().add(kFrame); 
     linhaT.setAutoReverse(true); 
     linhaT.setCycleCount(Animation.INDEFINITE); 
     linhaT.play(); 
    } 

    this.rect_background = new Rectangle(); 

    this.root.getChildren().add(this.rect_background); 
    this.root.getChildren().add(this.grp_hexagons); 

    // UI 

    this.lay_box_controls = new VBox(); 
    this.lay_box_controls.setSpacing(20); 
    this.lay_box_controls.setAlignment(Pos.CENTER); 

    this.bot_test = new Button("CHANGE POSITIONS"); 
    this.bot_test.setAlignment(Pos.CENTER); 

    this.bot_test.setOnAction(new EventHandler<ActionEvent>() 
    { 
     @Override public void handle(ActionEvent e) 
     { 
      for(Node hexagono : grp_hexagons.getChildren()) 
      { 
       hexagono.setTranslateX(Math.random() * cenario.getWidth()); 
       hexagono.setTranslateY(Math.random() * cenario.getHeight()); 
      } 
     } 
    }); 

    this.texA_test = new TextArea(); 
    this.texA_test.setText("This is just a test."); 

    this.lab_test = new Label("This is just a label."); 
    this.lab_test.setTextFill(Color.WHITE); 
    this.lab_test.setFont(new Font(32)); 

    this.lay_box_controls.getChildren().add(this.lab_test); 
    this.lay_box_controls.getChildren().add(this.texA_test); 
    this.lay_box_controls.getChildren().add(this.bot_test); 

    this.root.getChildren().add(this.lay_box_controls); 
} 
} 

我試圖使用StackPane作爲我的場景圖的根,但也發現了一個不希望的結果。儘管控件一直停留在窗口的中心,但隨着它們的增長和縮小,這些圈子開始移動,看起來一切都很奇怪。

我想知道的第二件事是,如果可以自定義控件,以便在某些事件發生時執行某些動畫。儘管我們可以使用CSS來改變控件的外觀,但是創建複雜的東西卻很困難。例如,當一個控件由於狀態的改變而改變其外觀時,過渡狀態改變不是以動畫方式進行的,而是以突然和靜態的方式進行的。有沒有一種方法來動畫,例如,它的狀態之間的按鈕?這將使用JavaFX API完成?或者會使用CSS?或者以任何方式都不可能?

感謝您的關注。

回答

0

經過很多努力,我和Oracle社區的一些用戶可以解決這個問題。我不需要在這裏重複我們提出的所有決議,所以我會發布鏈接,以便您可以訪問問題的解決方案。我希望這對我們所有人都有利。無論如何感謝您的關注。

https://community.oracle.com/thread/2620500