2014-12-06 16 views
5

Attualmente sto lavorando con due classi di controller.Come chiudere una fase dopo un certo periodo di tempo JavaFX

In Controller1 crea una nuova fase che si apre in cima a quella principale.

Stage stage = new Stage(); 
Parent root = FXMLLoader.load(getClass().getResource("Controller2.fxml")); 
Scene scene = new Scene(root); 
stage.setScene(scene); 
stage.show(); 

Ora, una volta che la fase è aperta, voglio che rimanga aperto per circa 5 secondi prima della chiusura stessa.

All'interno controller2, Ho provato a implementare qualcosa di simile

long mTime = System.currentTimeMillis(); 
long end = mTime + 5000; // 5 seconds 

while (System.currentTimeMillis() > end) 
{ 
     //close this stage 
} 

ma non ho idea di cosa mettere dentro il ciclo while per chiuderla. Ho provato tutti i tipi e niente funziona.

risposta

17

Utilizzare un PauseTransition:

PauseTransition delay = new PauseTransition(Duration.seconds(5)); 
delay.setOnFinished(event -> stage.close()); 
delay.play(); 
0

Facendo a modo tuo, questo dovrebbe funzionare:

long mTime = System.currentTimeMillis(); 
long end = mTime + 5000; // 5 seconds 

while (mTime < end) 
{ 
    mTime = System.currentTimeMilis(); 
} 
stage.close(); 

è necessario salvare il vostro palco in una variabile. Forse è meglio farlo in una discussione, in modo da poter fare qualcosa entro i 5 secondi. Un altro modo sarebbe quello di eseguire un Thread.sleep (5000); e questo sarebbe anche più performante del ciclo while.

+3

Se si utilizza questo tipo di tecniche, è necessario * avere * per eseguirlo in una discussione, altrimenti il ​​contenuto dello stage non verrà visualizzato. Inoltre, dovresti racchiudere 'stage.close()' in un 'Platform.runLater (...)' dato che deve essere eseguito sul thread dell'applicazione FX. È più facile usare un 'PauseTransition'. –

0

Questo codice imposta il testo di un elemento TextArea e lo rende visibile per un certo periodo di tempo. Crea essenzialmente un messaggio di sistema pop-up:

public static TextArea message_text=new TextArea(); 

final static String message_text_style="-fx-border-width: 5px;-fx-border-radius: 10px;-fx-border-style: solid;-fx-border-color: #ff7f7f;"; 

public static int timer; 
public static void system_message(String what,int set_timer) 
{ 

    timer=set_timer; 

    message_text.setText(what); 
    message_text.setStyle("-fx-opacity: 1;"+message_text_style); 

    Thread system_message_thread=new Thread(new Runnable() 
    { 

     public void run() 
     { 

      try 
      { 
       Thread.sleep(timer); 
      } 
      catch(InterruptedException ex) 
      { 

      } 

      Platform.runLater(new Runnable() 
      { 

       public void run() 
       { 

        message_text.setStyle("-fx-opacity: 0;"+message_text_style); 

       } 

      }); 

     } 

    }); 

    system_message_thread.start(); 

} 

Questa soluzione è completamente generale. È possibile modificare i metodi setStyle in qualsiasi codice desiderato. Puoi aprire e chiudere un livello, se vuoi.

Problemi correlati