[英]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;
}
}
使用“默认”实现,您可以在需要FileModel
或MutableFileModel
地方传递此方法
接下来,我们需要包装功能
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
提示用户输入File
为null
,但我将由您自己决定。
看看如何使用动作了解更多详细信息
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.