Christopher Angel
Christopher Angel

Reputation: 25

JavaFX stage issue with hide and show

Im building an application that shows a window that ask the user if he want to suspend the computer with two button options, one of them its a YES and the PC suspends.

The other button named "Later" supposed to hide the window and after an hour it appears again and ask the same question.

Code for the "later buttton"

 noButton.setOnAction(event -> {


        Done=false; //boolean to close and open the frame
        Gui gui = new Gui();

            try {
                gui.start(classStage);
            } catch (Exception e) {
                e.printStackTrace();
            }

        });  

The boolean that you see in the code is bc it was the way i think i could control that, trust me i tried in different ways but no one just help me with the issue, here is the code of the GUI class

public class Gui extends Application {

public  Stage classStage = new Stage();

public static boolean Done=true;

public static boolean flag=true;


public Gui() {


}

@Override
public void start(Stage primaryStage) throws Exception {

    Done = Controller.isDone();
    classStage = primaryStage;


    Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
    primaryStage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth());
    primaryStage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight());
    primaryStage.setAlwaysOnTop(true);
    Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
    primaryStage.setTitle("Alerta suspencion de equipo");
    primaryStage.setScene(new Scene(root));
    primaryStage.setResizable(false);
    primaryStage.initStyle(StageStyle.UNDECORATED);

    if (Controller.isDone() == true) {
        primaryStage.show();

    } else if(Controller.isDone() == false) {
        primaryStage.hide();
         Platform.exit(); // this is the only way that the windows close 


    }
}

i know that Platform.exit(); kills the program but when i only use .hide(); of the Stage nothing happens, the window never closed, the worst part is that when i use the Platform.exit() command i cant make the frame appear again...

Anyone knows a way maybe easier to hide and show a window after certain time? maybe im doing this wrong.

Regards.

Upvotes: 0

Views: 4379

Answers (1)

James_D
James_D

Reputation: 209225

It's not really clear what's going on in the code in your question. The bottom line is that you should never create an instance of Application yourself; the only Application instance should be the one created for you.

I don't actually see any need to have a separate class for the functionality you've shown (though you could, of course). All you need to do is hide classStage if the no button is pressed, and open it again in an hour:

noButton.setOnAction(event -> {


    Done=false; //boolean to close and open the frame

    classStage.hide();
    PauseTransition oneHourPause = new PauseTransition(Duration.hours(1));
    oneHourPause.setOnFinished(e -> showUI(classStage));
    oneHourPause.play();
}); 

// ...

private void showUI(Stage stage) {

    Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
    stage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth());
    stage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight());
    stage.setAlwaysOnTop(true);
    Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
    stage.setTitle("Alerta suspencion de equipo");
    stage.setScene(new Scene(root));
    stage.setResizable(false);
    stage.initStyle(StageStyle.UNDECORATED);
    stage.show();
}

Note that the FX Application will exit if the last window is closed, by default. So you should call Platform.setImplicitExit(false); in your init() or start() method.

I am assuming you are reloading the FXML file because the UI might have changed since it was previously loaded. Obviously if that's not the case, all you have to do is show the stage again as it is:

noButton.setOnAction(event -> {


    Done=false; //boolean to close and open the frame

    classStage.hide();
    PauseTransition oneHourPause = new PauseTransition(Duration.hours(1));
    oneHourPause.setOnFinished(e -> classStage.show());
    oneHourPause.play();
}); 

Upvotes: 2

Related Questions