如何创建" save" java中的菜单项。我创建了"另存为"菜单项,但不知道如何创建"保存"菜单项

时间:2017-03-07 05:07:09

标签: java swing

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

           }

       });

基本上我想要的是创建一个" save" java中的菜单项。这样当用户第一次点击保存时,它会打开一个保存对话框,并要求用户输入文件名并保存。当用户想要再次保存同一个文件时,它应该只是自动保存文件而不打开保存对话框。

2 个答案:

答案 0 :(得分:1)

基本的想法是,当你拨打"另存为"时,你需要记住"其中"你保存到(和/或允许"保存"做类似的事情)

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

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,因为它为自包含,可重复使用和易于扩展的类提供了功能,正如您所见,{{1}的核心功能来自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,则为File的用户,但我会将其留给您解决。

有关详细信息,请查看How to use Actions

答案 1 :(得分:-1)

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