File 实例运行时是否可以刷新JavaFX中的程序文件?

File 实例运行时是否可以刷新JavaFX中的程序文件?,file,javafx,copy,nio,filechooser,File,Javafx,Copy,Nio,Filechooser,我正在构建一个库存管理系统,并创建了一个按钮,用于打开一个新的FXML,以便将新项目输入数据库。我已经创建了添加图像的功能,它使用URL更新数据库的图像列,当我单击保存时,它将图像从源位置保存到目标位置(这是程序中的一个包)。如果我保存并关闭程序,那么我可以在eclipse中刷新项目,重新登录到程序中,新添加的项将显示在从数据库填充的tableView中,而不会出现任何问题 我遇到的问题是,当我单击“保存”按钮时,我希望它“刷新”程序文件和包,因此当我查询零件数据库时,它将显示新添加的零件,而不

我正在构建一个库存管理系统,并创建了一个按钮,用于打开一个新的FXML,以便将新项目输入数据库。我已经创建了添加图像的功能,它使用URL更新数据库的图像列,当我单击保存时,它将图像从源位置保存到目标位置(这是程序中的一个包)。如果我保存并关闭程序,那么我可以在eclipse中刷新项目,重新登录到程序中,新添加的项将显示在从数据库填充的tableView中,而不会出现任何问题

我遇到的问题是,当我单击“保存”按钮时,我希望它“刷新”程序文件和包,因此当我查询零件数据库时,它将显示新添加的零件,而不会因为我在创建的图像包中看不到图像而引发错误(当程序关闭并刷新时,它会显示在那里)。是否可以用代码刷新这些映像包?是否应该将图像存储在外部文件中?如果没有,是否可以在不使用绝对路径的情况下将图像保存到程序包中

到目前为止,我掌握的代码是:

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

您绝对不应该在类文件中存储数据文件。在捆绑应用程序的真实场景中,这无论如何都不会起作用。

在运行应用程序时,应避免修改应用程序的资源

当然,您可以尝试通过使用
ClassLoader
s(例如use)来实现这一点,但我认为,不将文件存储为资源,而是将其存储在不在类路径内的目录中并访问这些文件要简单得多。您可以使用以下方法从路径p
获取URL字符串:

p.toUri().toURL().toExternalForm()

从技术上讲,我不需要关闭程序。我已经能够点击我的IDE和F5进行刷新,我可以在我的包中看到保存的图像弹出,返回到程序,它不会出错,并在tableView中显示新项目。我只是想知道,当我点击“保存”按钮时,是否有代码可以执行此操作。感谢您的回复,我将不得不对存储程序文件进行更多研究。在数据库中,我有指向图像所在位置的url。如果程序可以保存在任何驱动器上的任何位置,并且我必须在工作时将图像存储在驱动器上的特定位置,并将硬代码写入指向该位置的位置,我不太确定如何每次都以相同的方式指向图像?这通常是如何做到的?你有没有一个链接可以为我指出这样的信息如何最好地存储的正确方向,我自己看起来运气不太好。谢谢谢谢你的回复,你知道有什么好的资源可以帮助你完成这项工作吗?我在网上没怎么走运,可能问的问题不对,谢谢!