2017-04-15 1 views
0

Je suis nouveau sur StackOverflow et Java, donc je m'excuse si ce n'est pas au bon endroit et si ma compréhension des concepts Java est désactivée. J'ai regardé autour en ligne, mais n'ai pas trouvé une solution à mon problème, et je ne comprends pas pourquoi ceci se produit.Java: Enregistrer une image dans un répertoire de fichiers sans quitter l'application

Je fais une application qui prend une capture d'écran de mon écran et l'enregistre dans le répertoire source du projet. Après avoir enregistré l'image, une autre fenêtre s'ouvre et affiche cette image.

Mon problème est la sauvegarde de l'image. Je peux l'enregistrer, mais la capture d'écran n'apparaît dans le répertoire du projet qu'après avoir fermé tout le programme, provoquant une erreur car l'image ne peut pas être lue une première fois car l'image n'existe pas dans le répertoire c'est être sauvé. Après la fermeture, l'image apparaît dans le répertoire et le programme s'exécute comme il se doit sans erreur après l'avoir exécuté une seconde fois.

Je ne comprends pas pourquoi cela se produit. Comment se fait-il que l'image n'apparaisse dans le répertoire du fichier qu'après la fin du programme et comment pourrais-je résoudre ce problème? J'utilise JavaFx avec FXML dans Inteliji Idea.

Toute aide serait très appréciée.

// This method/function runs on a simple button press. 
public void screenshot() throws Exception{ 


    // Hides the window 
    boarderPane.getScene().getWindow().hide(); 

    String format = "jpg"; 
    String fileName = "FullScreenshot." + format; 

      try { 

       // This gives the window enough time to hide so it doesn't get caught in the screenshot 
       Thread.sleep(500); 


       Robot robot = new Robot(); 


       Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 

       BufferedImage screenFullImage = robot.createScreenCapture(screenRect); 
       ImageIO.write(screenFullImage, format, new File("src\\image\\" + fileName)); 

       System.out.println("A full screenshot saved!"); 

      } catch (AWTException ex) { 
       System.err.println(ex); 
      } 


    // Creates a new window that will display the screenshot 
    Stage imageStage = new Stage(); 

    Parent newWindow = FXMLLoader.load(getClass().getResource("screenshotWindow.fxml")); 
    imageStage.setTitle("Caliber --- Current Screen Shot Window"); 
    imageStage.setScene(new Scene(newWindow, 800, 800)); 
    imageStage.show(); 

    // Saves the screenshot location so it can be used in the other window 
    MasterVariables.image = new Image("image\\" + 

Répondre

1

Vous devez penser à votre demande comme quelque chose qui sera exécuté sur le poste de travail d'un utilisateur réel.

Un utilisateur réel (c'est-à-dire, pas vous) n'aura aucun projet IntelliJ. Il/elle n'aura aucun répertoire src. Tout ce qu'il/elle aura est un fichier jar en lecture seule contenant les classes compilées et les ressources statiques de votre application, un répertoire personnel et un répertoire temporaire.

Ainsi, enregistrez l'image sous forme de fichier, quelque part dans le répertoire personnel de l'utilisateur ou en tant que fichier temporaire, et le charger à partir de ce fichier, en utilisant le fichier IO (et non le ClassLoader, qui n'a accès aux ressources dans votre fichier jar en lecture seule). Ou évitez de l'enregistrer dans un fichier en premier lieu, et enregistrez-le simplement en mémoire.

Si vous voulez savoir pourquoi cela ne fonctionne pas, c'est parce que vous chargez l'image en utilisant le ClassLoader. Le ClassLoader peut charger tout ce qui est sous un répertoire ou un fichier jar qui se trouve dans le classpath. Votre répertoire src n'est pas dans le classpath.

+1

Génial. Merci beaucoup. Je l'ai maintenant travailler à cause de vous. –

+0

Génial. Heureux d'avoir aidé. Vous devriez accepter la réponse, alors. Pour me remercier, mais aussi pour répondre à cette question. –