繁体   English   中英

如何在Java中创建“保存”菜单项。 我已经创建了“另存为”菜单项,但是不知道如何创建“另存为”菜单项

[英]How to create a “save” menu item in java. I have created the “save as ” menu item but don't know how to create the “save” menu item

jmi = jm.add(new JMenuItem("Save As...", 'V'));
       jm.addSeparator(); 
       jmi.addActionListener(e->{
           if ( jfc.showSaveDialog(EmployeeApp2.this)==
                   JFileChooser.APPROVE_OPTION){
               File f = jfc.getSelectedFile();
               int size = (int) f.length();
               char ch[] = new char [size];

               try{
               FileWriter fw = new FileWriter(f);
               fw.write(ch,0,size);
               fw.close();
               } catch (FileNotFoundException ex){
                   System.err.println("File unable to save");
               }catch (IOException excp){
                   System.err.println("IO");
               }

              String s = new String (ch);
              List.getData(s);
              repaint();

           }

       });

因此,基本上我想在Java中创建一个“保存”菜单项。 因此,当用户第一次单击“保存”时,它会打开一个保存对话框,并要求用户输入文件名并保存。 当用户想要再次保存相同文件时,它应该自动保存文件而无需打开保存对话框。

基本思想是,当您调用“另存为”时,您需要记住保存到的“位置”(和/或允许“保存”执行类似操作)

在我看来,这意味着一个模型...

public interface FileModel {
    public File getCurrentFile();
}

public interface MutableFileModel extends FileModel {
    public void setCurrentFile(File file);
}

这里的想法是限制谁可以更改当前文件。

public class DefaultFileModel implements MutableFileModel {

    private File currentFile;

    public File getCurrentFile() {
        return currentFile;
    }

    public void setCurrentFile(File file) {
        currentFile = file;
    }
}

使用“默认”实现,您可以在需要FileModelMutableFileModel地方传递此方法

接下来,我们需要包装功能

public abstract class AbstractFileAction<M extends FileModel> extends AbstractAction {

    private M model;

    public AbstractFileAction(M model) {
        this.model = model;
    }

    protected M getModel() {
        return model;
    }
}

public class SaveFileAction<M extends FileModel> extends AbstractFileAction<M> {

    public SaveFileAction(M model) {
        super(model);
        putValue(NAME, "Save");
        putValue(MNEMONIC_KEY, KeyEvent.VK_S);
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        File file = getModel().getCurrentFile();
        if (file != null) {
            //...
        }
    }
}

public class SaveFileAsAction extends SaveFileAction<MutableFileModel> {

    public SaveFileAsAction(MutableFileModel model) {
        super(model);
        putValue(NAME, "Save As...");
        putValue(MNEMONIC_KEY, KeyEvent.VK_A);
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_DOWN_MASK));
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        File file = //...
        getModel().setCurrentFile(file);
        super.actionPerformed(evt);
    }
}

在这里,我决定使用Action API,因为它为自包含,可重用和易于扩展的类提供功能,如您所见, SaveFileAsAction的核心功能来自SaveFileAction ,无需重复自己。

然后,您只需要为用户设置所有内容即可...

DefaultFileModel model = new DefaultFileModel();

JMenu menu = new JMenu("File");
menu.add(new SaveFileAction(model));
menu.add(new SaveFileAsAction(model));

JMenuBar mb = new JMenuBar();
mb.add(menu);

现在,这是一个过于简化的示例,我可能会向模型添加观察者模式以在模型更改时生成事件,并更新SaveFileAction的状态,或者如果模型的值允许SaveFileAction提示用户输入Filenull ,但我将由您自己决定。

看看如何使用动作了解更多详细信息

public class SaveFile 
{
     public static void main(String [] args)
     {

          Frame SecondFrame = new JFrame();
          JFileChooser fileChooser = new JFileChooser();
          fileChooser.setDialogTitle("Specify a file to save");
          int userSelection = fileChooser.showSaveDialog( SecondFrame);
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM