2014-12-06 5 views
5

В настоящее время я работаю с двумя классами контроллеров.Как закрыть сцену через определенное время JavaFX

В Controller1 он создает новый этап, который открывается сверху основного.

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

Теперь, когда эта стадия открыта, я хочу, чтобы она оставалась открытой около 5 секунд до закрытия.

В Controller2, я пытался что-то вроде реализации

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

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

, но я понятия не имею, что положить в то время цикла, чтобы закрыть его. Я пробовал все виды, и ничего не работает.

ответ

17

Используйте PauseTransition:

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

Делая это ваш путь, это будет работать:

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

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

Вы должны сохранить сцену в переменной. Возможно, лучше запустить это в потоке, чтобы вы могли что-то сделать за 5 секунд. Другим способом было бы запустить Thread.sleep (5000); и это также будет более результативным, чем цикл while.

+3

Если вы используете такие методы, вы бы * имели *, чтобы запустить это в потоке, иначе содержимое сцены не будет отображаться. Кроме того, вам придется обернуть 'stage.close()' в 'Platform.runLater (...)', поскольку это должно быть выполнено в потоке приложения FX. Легче использовать 'PauseTransition'. –

0

Этот код устанавливает текст TextArea элемента и делает его видимым в течение определенного промежутка времени. Он по существу создает всплывающее системное сообщение:

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(); 

} 

Это решение является полностью общим. Вы можете изменить методы setStyle на любой код, который вы хотите. Вы можете открыть и закрыть сцену, если хотите.