2017-03-07 73 views
0
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中創建「保存」菜單項。這樣當用戶第一次點擊保存時,它會打開一個保存對話框,並要求用戶輸入文件的名稱並保存。當用戶想再次保存同一文件時,應該自動保存文件而不打開保存對話框。如何在java中創建「保存」菜單項。我創建了「另存爲」菜單項,但不知道如何創建「保存」菜單項

+1

我建議要看看[如何使用行動](http://docs.oracle.com/javase/tutorial/uiswing/misc/ action.html),基本思想是,你需要知道什麼「保存到」保存到,所以你在使用「保存」時重新使用它 – MadProgrammer

+0

只需跟蹤哪個文件在變量中打開並使用作爲地址保存到 – nhouser9

回答

0

的基本想法是,當你調用「另存爲」,你需要記住「其中」保存到(和/或允許「保存」做同樣的事情)

在我看來,這種手段一個模型...

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,no需要重複自己。

然後你只需要設置一切,爲用戶...

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的狀態,或者如果模型的值爲null,允許SaveFileAction提示用戶輸入File,但我會留給您弄清楚。

看一看How to use Actions更多細節

+0

非常感謝。我會問你說,並閱讀更多關於「如何使用操作」 - @ MasProgrammer –