2017-01-19 1 views
0

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.JavaFX stade problème avec cacher et afficher

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

Code pour la « 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 que je pouvais contrôler que, croyez-moi j'ai essayé de différentes manières, mais personne ne vient aidez-moi 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 sais que Platform.exit(); tue le programme mais quand je n'utilise que .hide(); de la scène rien ne se passe, la fenêtre ne se ferme jamais, le pire est que quand j'utilise la commande Platform.exit() je ne peux pas faire apparaître le cadre à nouveau ...

Tout le monde connaît un moyen peut-être plus facile de cacher et de montrer une fenêtre après un certain temps? peut-être que je fais ça mal.

Cordialement.

+0

Vous pouvez utiliser un 'Thread' ou une' PauseTransition'. Le second est recommandé. – GOXR3PLUS

+0

Pourquoi instanciez-vous une sous-classe 'Application'? Vous avez probablement déjà une autre sous-classe 'Application', puisque votre application JavaFX est déjà en cours d'exécution. Vous ne devriez avoir qu'une seule instance 'Application' dans un programme JavaFX, et elle devrait être celle créée pour vous lorsque vous lancez l'application FX. –

+0

Il n'est pas clair pourquoi 'classStage.hide()' ne fonctionne pas: cela n'a rien à voir avec le code que vous avez publié. Créez un [MCVE] qui reproduit le problème et [modifier] votre question pour l'inclure. Vous devriez être capable d'écrire un exemple complet avec la fonctionnalité que vous avez décrite (deux boutons, etc) dans seulement quelques douzaines de lignes de code, ce qui est bien dans les limites acceptables pour une question ici. –

Répondre

2

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 une instance de Application vous-même; la seule instance Application devrait être celle créée pour vous.

Je ne vois pas vraiment le besoin d'avoir une classe séparée pour la fonctionnalité que vous avez montrée (bien que vous puissiez, bien sûr). Tout ce que vous devez faire est de cacher classStage si le pas de bouton est pressé, et ouvrez-le à 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 quittera si la dernière fenêtre est fermée, par défaut. Vous devez donc appeler Platform.setImplicitExit(false); dans votre méthode init() ou start().

Je suppose que vous rechargez le fichier FXML parce que l'interface utilisateur peut avoir changé depuis qu'elle a été précédemment chargée. É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(); 
}); 
+0

en fait l'un des plus gros problèmes avec est que la méthode classStage.hide ne fonctionne pas, la scène ne se cache jamais. –

+0

@ChristopherAngel Alors quelque chose d'autre est faux dans votre code, essentiellement séparé de tout ce que vous avez posté. –