2015-04-23 54 views
1

我一直在尋找互聯網,我找不到我的問題的答案,所以我會嘗試自己做,並希望最好!JavaFX - FadeOut - >切換階段

我有一個首要的東西,它提供了一個歡迎然後淡出,但是我想在那個淡出不見的時刻切換舞臺!有沒有人有這個答案?

下面的小代碼,以獲得更好的理解:

import java.util.Timer; 
import java.util.TimerTask; 
import javafx.animation.FadeTransition; 
import javafx.application.Application; 
import javafx.geometry.Insets; 

import javafx.geometry.Pos; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.GridPane; 
import javafx.scene.text.Font; 
import javafx.scene.text.FontWeight; 
import javafx.scene.text.Text; 
import javafx.util.Duration; 



public class TextFileOPG extends Application { 

private Stage switchStage; 

@Override 
public void start(Stage primaryStage) { 
    try { 

      switchStage = primaryStage; 

      GridPane root = new GridPane(); 

      root.setAlignment(Pos.CENTER); 

      Text scenetitle = new Text("Welcome"); 
      scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40)); 
      root.add(scenetitle, 3, 2); 

      FadeTransition ftOUT = new FadeTransition(Duration.millis(3000), root); 
      ftOUT.setFromValue(1.0); 
      ftOUT.setToValue(0.0); 
      ftOUT.play(); 

      if(ftOUT.equals(Duration.millis(3000))) 
      { 
       loggedIn(); 
      } 

      primaryStage.setTitle("Welcome"); 
      Scene scene = new Scene(root,350,400); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 


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

public void loggedIn() 
{ 
    switchStage.setTitle("Try"); 

    GridPane grid = new GridPane(); 

    grid.setAlignment(Pos.CENTER); 

    Text thisIsSoCoolText = new Text("Welcome Again"); 
    thisIsSoCoolText.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40)); 
    grid.add(thisIsSoCoolText, 3, 2); 

    Scene scene = new Scene(grid, 350, 400); 
    switchStage.setScene(scene); 
    switchStage.show(); 
} 

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

回答

0

嘗試使用一個時間表,而不是淡出過渡。時間軸可用於各種動畫和UI更新。

這裏是爲我工作的代碼:

import java.util.Timer; 
import java.util.TimerTask; 

import javafx.animation.FadeTransition; 
import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.GridPane; 
import javafx.scene.text.Font; 
import javafx.scene.text.FontWeight; 
import javafx.scene.text.Text; 
import javafx.util.Duration; 



public class TextFileOPG extends Application { 

private Stage switchStage; 
final double opacity=1; 
@Override 
public void start(Stage primaryStage) { 
try { 

     switchStage = primaryStage; 

     GridPane root = new GridPane(); 

     root.setAlignment(Pos.CENTER); 

     Text scenetitle = new Text("Welcome"); 
     scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40)); 
     root.add(scenetitle, 3, 2);   


     primaryStage.setTitle("Welcome"); 
     Scene scene = new Scene(root,350,400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     Timeline tick0 = new Timeline(); 
     tick0.setCycleCount(Timeline.INDEFINITE); 
     tick0.getKeyFrames().add(
       new KeyFrame(new Duration(30), new EventHandler<ActionEvent>() { 
        public void handle(ActionEvent t) { 
         root.setOpacity(root.getOpacity()-0.01); 
         if(root.getOpacity()<0.01){//30 divided by 0.01 equals 3000 so you take the duration and divide it be the opacity to get your transition time in milliseconds 
          loggedIn(); 
          tick0.stop(); 
         } 
        }})); 
     tick0.play(); 

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

public void loggedIn() 
{ 
switchStage.setTitle("Try"); 

GridPane grid = new GridPane(); 

grid.setAlignment(Pos.CENTER); 

Text thisIsSoCoolText = new Text("Welcome Again"); 
thisIsSoCoolText.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40)); 
grid.add(thisIsSoCoolText, 3, 2); 

Scene scene = new Scene(grid, 350, 400); 
switchStage.setScene(scene); 
switchStage.show(); 
} 

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

嗨,哥們。謝謝 !我試過你的解決方案,它工作得很好!很好學習一些TimeLine! –

+0

歡迎您,如果您有任何其他問題,只需提交 – sazzy4o

1

而不是

if(ftOUT.equals(Duration.millis(3000))) { 
    loggedIn(); 
} 

(這不會有任何效果:一個FadeTransition實例不可能是等於Duration實例),請使用onFinished處理器用於淡入淡出轉換:

ftOUT.setOnFinished(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     loggedIn(); 
    } 
}); 

請注意,您應該在ftOUT.play()之前調用此(儘管它仍然可以工作...)。

如果你使用JavaFX的8,你可以做

ftOUT.setOnFinished(event -> loggedIn()); 
+0

這很簡單!爲什麼我沒有想到一個事件處理者!我一定很累。很高興看到燈泡表達。謝了哥們 :) –