如何修复我的代码,使其同时包含“保存”和“另存为”功能?

Posted

技术标签:

【中文标题】如何修复我的代码,使其同时包含“保存”和“另存为”功能?【英文标题】:How can I fix my code so that it contains both a "save" and "save as" functions? 【发布时间】:2019-09-02 22:43:29 【问题描述】:

我在一个菜单栏中有两个按钮,其中包含一个保存和另存为按钮。但是,我目前有两个相同的代码,并且它会像当前一样保存并提示用户他们想要保存的位置。我希望保存按钮只保存而不提示对话框,除非文件尚不存在。

我曾尝试摆弄代码以尝试找出解决方法,但还没有弄清楚。

fileMenu.getItems().add(saveItem);
    saveItem.setOnAction(new EventHandler<ActionEvent>() 
        @Override
        public void handle(ActionEvent event) 
            FileChooser saveFile = new FileChooser();
            saveFile.getExtensionFilters().add(new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg"));
            saveFile.setTitle("Save File");

            File file = saveFile.showSaveDialog(stage);
            if (file != null) 
                try 
                    WritableImage writableImage = new WritableImage(width, height);
                    canvas.snapshot(null, writableImage);
                    RenderedImage renderedImage = SwingFXUtils.fromFXImage(writableImage, null);
                    ImageIO.write(renderedImage, "png", file);
                 catch (IOException ex) 
                    System.out.println("Error");
                
            
        
    );
    fileMenu.getItems().add(saveAsItem);
    saveAsItem.setOnAction(new EventHandler<ActionEvent>() 
        @Override
        public void handle(ActionEvent event) 
            FileChooser saveFile = new FileChooser();
            saveFile.getExtensionFilters().add(new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg"));
            saveFile.setTitle("Save File");

            File file = saveFile.showSaveDialog(stage);
            if (file != null) 
                try 
                    WritableImage writableImage = new WritableImage(width, height);
                    canvas.snapshot(null, writableImage);
                    RenderedImage renderedImage = SwingFXUtils.fromFXImage(writableImage, null);
                    ImageIO.write(renderedImage, "png", file);
                 catch (IOException ex) 
                    System.out.println("Error");
                
            
        
    );

代码当前为每个保存按钮执行完全相同的保存功能。我希望它只提示另存为按钮。

【问题讨论】:

好吧,“保存”将取决于“另存为”(或“打开”),因为它依赖于事先知道您将要保存的“位置”。考虑到这一点,您需要将位置“存储”在以后可以访问的某个位置(例如经理或其他东西)。一旦你有了这些信息,你可以编写一个“saveTo”方法,它引用File并执行实际的保存操作,这样savesaveAs只需要调用这个方法并传入前面- 提及File 引用,来自内存或来自用户 我的第一个建议是编写一个saveTo 方法,它采用File 引用并执行保存操作。从那里,您需要填写savesaveAs 的要求,以便他们可以获得对用户想要使用的File 的引用并将其传递给saveTo 方法 【参考方案1】:

您的类中需要有一个 File 实例字段,该字段最初分配为 null。当您读入文件或进行第一次保存时,此字段将分配给该文件。当按下save 按钮时,检查该字段是否为空,如果是,则显示对话框,就像显示save-as 按钮一样。如果该字段为空,那么您只需使用您拥有的数据和该文件将文件写入磁盘。

例如(代码未测试):

// a private instance field
private File myFile = null;
fileMenu.getItems().add(saveItem);
saveItem.setOnAction(new EventHandler<ActionEvent>() 
    @Override
    public void handle(ActionEvent event) 
        if (myFile == null) 
            saveAs();
         else 
            writeFile(myFile);
        
    
);

fileMenu.getItems().add(saveAsItem);
saveAsItem.setOnAction(new EventHandler<ActionEvent>() 
    @Override
    public void handle(ActionEvent event) 
        saveAs();
    
);
private void writeFile(File file) 
    if (file != null) 
        try 
            WritableImage writableImage = new WritableImage(width, height);
            canvas.snapshot(null, writableImage);
            RenderedImage renderedImage = SwingFXUtils.fromFXImage(writableImage, null);
            ImageIO.write(renderedImage, "png", file);
         catch (IOException ex) 
            System.out.println("Error");
        
    


private void saveAs() 
    FileChooser saveFile = new FileChooser();
    saveFile.getExtensionFilters().add(new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg"));
    saveFile.setTitle("Save File");

    File file = saveFile.showSaveDialog(stage);
    myFile = file; // !! 
    writeFile(file);

【讨论】:

以上是关于如何修复我的代码,使其同时包含“保存”和“另存为”功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何有一个打开另存为窗口的保存按钮? [关闭]

GUI设计:合并“保存”和“另存为”

提示文件打开,进行更改并另存为另一个副本,然后关闭+取消保存原始文件

创建一个不允许用户另存为文本的 pdf

HTML中保存,另存为,功能是如何实现的

PHP另存为PDF不起作用