Problème de scène JavaFX avec masquer et afficher


Im construire une application qui montre une fenêtre qui demande à l'utilisateur s'il veut suspendre l'ordinateur avec deux options de bouton, l'un d'eux est un OUI et le PC suspend.

L'autre bouton nommé "Plus tard" censé masquer la fenêtre et après une heure, il apparaît à nouveau et poser la même question.

Code pour le "plus tard 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();
            }

        });  

Le booléen que vous voyez dans le code est bc c'était la façon dont je pense pouvoir contrôler cela, croyez-moi, j'ai essayé de différentes manières mais non on m'aide juste avec le problème, voici le code de la classe GUI

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 


    }
}

Je connais cette plate-forme.exit (); tue le programme mais quand je n'utilise que .hide (); de la scène rien ne se passe, la fenêtre ne s'est jamais fermée, le pire est que lorsque j'utilise la plate-forme.exit () commande je ne peux pas faire apparaître le cadre à nouveau...

Quelqu'un connaît un moyen peut-être plus facile de cacher et d'afficher une fenêtre après un certain temps? peut-être im faire ce mal.

Cordialement.

Author: Christopher Angel, 2017-01-19

1 answers

Ce n'est pas vraiment clair ce qui se passe dans le code de votre question. L'essentiel est que vous ne devriez jamais créer vous-même une instance de Application; la seule instance de Application devrait être celle créée pour vous.

Je ne vois pas vraiment le besoin d'avoir une classe distincte pour les fonctionnalités que vous avez montrées (bien que vous puissiez, bien sûr). Tout ce que vous avez à faire est de masquer classStage si le bouton no est enfoncé, et de l'ouvrir à nouveau dans une heure:

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

Notez que l'application FX se fermera si la dernière fenêtre est fermée, par défaut. Vous devriez donc appeler Platform.setImplicitExit(false); dans votre méthode init() ou start().

Je suppose que vous rechargez le fichier FXML car l'interface utilisateur a peut-être changé depuis qu'il a été précédemment chargé. Évidemment, si ce n'est pas le cas, tout ce que vous avez à faire est de montrer à nouveau la scène telle qu'elle est:

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();
}); 
 2
Author: James_D, 2017-01-19 18:40:36