2016-03-17 2 views
0

Je construis un système de gestion d'inventaire et j'ai créé un bouton qui ouvre un nouveau FXML pour entrer un nouvel élément dans la base de données. J'ai créé la possibilité d'ajouter une image et met à jour la colonne d'image de la base de données avec l'URL et quand je clique sur sauvegarder, elle copie l'image de l'emplacement source à l'emplacement cible (qui est un paquet dans le programme). Si je sauvegarde et ferme le programme, je peux actualiser le projet dans eclipse, me reconnecter au programme et l'élément nouvellement ajouté s'affichera dans la tableView peuplée de la base de données sans aucun problème. Le problème que j'ai, c'est que lorsque je clique sur le bouton Sauvegarder, je voudrais 'rafraîchir' les programmes et les paquets, donc quand j'interroge la base de données des pièces, elle affiche les nouvelles pièces et ne me renvoie pas une erreur. ne voit pas l'image dans le paquet d'image que j'ai créé (il montre là quand le programme est fermé et rafraîchi). Est-il possible de rafraîchir ces paquets d'images avec du code? Les images doivent-elles être stockées dans un fichier externe à la place? Si non, est-il possible d'enregistrer des images dans les paquets du programme sans avoir à utiliser le chemin absolu?Est-il possible d'actualiser des fichiers programme dans JavaFX lorsqu'une instance est en cours d'exécution?

Le code que j'ai à ce jour est:

// Event Listener on Button[#saveItemBtn].onAction 
@FXML 
public void saveNewItemClicked(ActionEvent event) { 
    try{ 
     this.dbState = (String) databaseChoiceBox.getValue(); 

     DBConnection dBC = new DBConnection(); 
     con = dBC.getDBConnection(); 
     String maxSQL = "SELECT MAX(id) FROM " + dbState + "_parts_list"; 
     ResultSet rs = con.createStatement().executeQuery(maxSQL); 

     int idNumber = rs.getInt(1); 
     idNumber++; 

     quantity = Integer.parseInt(quantityTxt.getText()); 
     min = Integer.parseInt(minTxt.getText()); 
     max = Integer.parseInt(maxTxt.getText()); 


     double price = Double.parseDouble(priceTxt.getText()); 
     SelectedItem selectedItem = new SelectedItem(); 
     selectedItem.setId(idNumber); 
     selectedItem.setQuantity(quantity); 
     selectedItem.setMin(min); 
     selectedItem.setMax(max); 
     selectedItem.setEquipment_id(equipmentIDTxt.getText()); 
     selectedItem.setEquipment_group(equipmentGroupTxt.getText()); 
     selectedItem.setPrice(price); 
     selectedItem.setManufacturer_name(manufacturerNameTxt.getText()); 
     selectedItem.setModel_number(modelNumberTxt.getText()); 
     selectedItem.setVendor_name(vendorNameTxt.getText()); 
     selectedItem.setVendor_part_number(vendorPartNumberTxt.getText()); 
     selectedItem.setTolmar_part_number(tolmarPartNumberTxt.getText()); 
     selectedItem.setDescription(descriptionTxt.getText()); 
     selectedItem.setAdditional_notes(additionalNotesTxt.getText()); 
     selectedItem.setPart_location(locationTxt.getText()); 
     if (img != null) { 
      selectedItem.setImage("/" + dbState + "Images/" + imagePath); 
     } else { 
      selectedItem.setImage("/img/NoImageFound.png"); 
     } 
     selectedItem.setDepartment(databaseChoiceBox.getValue().toLowerCase()); 

     String sql = "INSERT INTO " + dbState + "_parts_list VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

     PreparedStatement myStmt = con.prepareStatement(sql); 
     myStmt.setInt(1, idNumber); 
     myStmt.setString(2, selectedItem.getManufacturer_name()); 
     myStmt.setString(3, selectedItem.getModel_number()); 
     myStmt.setString(4, selectedItem.getVendor_name()); 
     myStmt.setString(5, selectedItem.getVendor_part_number()); 
     myStmt.setString(6, selectedItem.getTolmar_part_number()); 
     myStmt.setString(7, selectedItem.getPart_location()); 
     myStmt.setDouble(8, selectedItem.getPrice()); 
     myStmt.setInt(9, selectedItem.getQuantity()); 
     myStmt.setInt(10, selectedItem.getMin()); 
     myStmt.setInt(11, selectedItem.getMax()); 
     myStmt.setString(12, selectedItem.getImage()); 
     myStmt.setString(13, selectedItem.getEquipment_group()); 
     myStmt.setString(14, selectedItem.getEquipment_id()); 
     myStmt.setString(15, selectedItem.getAdditional_notes()); 
     myStmt.setString(16, selectedItem.getDescription()); 
     myStmt.setString(17, selectedItem.getDepartment()); 
     myStmt.executeUpdate(); 
     saveStatusLbl.setText("New Item Saved"); 
     Path source = Paths.get(img); 
     Path target = Paths.get("E:/Programming/workspace/Inventory Management System 4/src/" + dbState + "Images/", file.getName()); 
     try { 
      //replace existing file using java nio package 
      Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     con.close(); 
     PauseTransition delay = new PauseTransition(Duration.seconds(2)); 
     delay.setOnFinished(e -> window.close()); 
     delay.play(); 

     }catch(Exception exc){ 
      System.out.println(exc); 
      exc.printStackTrace(); 
     }  
} 
+0

techniquement, je n'ai pas besoin de fermer le programme. J'ai pu cliquer sur mon IDE et F5 pour actualiser et je peux voir l'image sauvegardée apparaître dans mon paquet, revenir au programme et il ne se trompe pas et montre le nouvel élément dans tableView. Je me demande simplement s'il y a du code pour faire ceci quand je clique sur le bouton de sauvegarde. – dubski

Répondre

0

Vous devriez certainement pas stocker vos fichiers de données parmi vos fichiers de classe. Dans un scénario réel où vous avez regroupé votre application, cela ne fonctionnerait pas de toute façon.

+0

Merci pour votre réponse, connaissez-vous de bonnes ressources pour ce qui est normalement fait? Je n'ai pas eu beaucoup de chance en regardant sur internet et je ne pose probablement pas la bonne question, merci! – dubski

0

Vous devez éviter de modifier les ressources d'une application pendant son exécution.

Bien sûr, vous pouvez essayer de le faire fonctionner en jouant avec ClassLoader s. utilisez URLClassLoader, mais à mon humble avis, il est beaucoup plus simple de ne pas stocker les fichiers en tant que ressources, mais de les stocker dans un répertoire qui ne se trouve pas dans le chemin de classe et d'accéder à ces fichiers. Vous pouvez obtenir une chaîne URL à partir d'un Path p en utilisant:

p.toUri().toURL().toExternalForm() 
+0

je vous remercie pour la réponse, je vais devoir faire plus de recherche sur le stockage des fichiers pour un programme. Dans la base de données, j'ai l'URL pour indiquer où sont les images. Je ne suis pas sûr de savoir comment pointer les images de la même manière à chaque fois si le programme peut être enregistré n'importe où sur n'importe quel lecteur et je devrais stocker les images dans un emplacement spécifique sur un disque au travail et avoir le code dur écrit pointez-vous là? Comment cela se fait-il normalement? Avez-vous un lien qui pourrait me pointer dans la bonne direction de la façon dont les informations de ce genre sont mieux stockées, je n'ai pas eu beaucoup de chance à me regarder. Merci! – dubski