2015-04-23 53 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

这很简单!为什么我没有想到一个事件处理者!我一定很累。很高兴看到灯泡表达。谢了哥们 :) –