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中的菜单项。这样当用户第一次点击保存时,它会打开一个保存对话框,并要求用户输入文件名并保存。当用户想要再次保存同一个文件时,它应该只是自动保存文件而不打开保存对话框。
答案 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;
}
}
使用"默认"实施时,您可以在需要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,因为它为自包含,可重复使用和易于扩展的类提供了功能,正如您所见,{{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);
}
}