import java.awt.*;
import java.awt.event.*;
import java.io.*;
class  MenuDemo
{
private Frame f;
private MenuBar mb;
private Menu m;
private MenuItem dm,gm,bm;
private FileDialog open,save;
private TextArea ta;
private File file;
MenuDemo()
{
init();
}
public void init()
{
f=new Frame("魔兽世界");
mb=new MenuBar();
m=new Menu("文件");
dm=new MenuItem("打开");
gm=new MenuItem("退出");
bm=new MenuItem("保存");
open=new FileDialog(f,"打开WoW",FileDialog.LOAD);
save=new FileDialog(f,"关闭WoW",FileDialog.SAVE);
ta=new TextArea();
f.setBounds(300,100,600,600);
//f.setLayout(new FlowLayout());使用默认布局,没设置东南西北,就填充了
f.setMenuBar(mb);
f.add(ta);
mb.add(m);
m.add(dm);
m.add(bm);
m.add(gm);
myEvent();
f.setVisible(true);
}  private void myEvent()  
 {  
 bm.addActionListener(new ActionListener()
 {
public void actionPerformed(ActionEvent e)
    {
if(file==null)
{
save.setVisible(true);
String s1=save.getFile();
String s2=save.getDirectory();
if (s1==null||s2==null)
{
return;
}
file=new File(s2,s1);
}
else
{
BufferedWriter bw=null;
try
{
bw=new BufferedWriter(new FileWriter(file));
String s=ta.getText();
bw.write(s);
bw.flush();
bw.close();
}
catch (IOException e1)
{
throw new RuntimeException("写入失败");
} }

}
 });
dm.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
open.setVisible(true);
String filePath=open.getDirectory();
String name=open.getFile();
if (filePath==null||name==null)
{
return;
}
ta.setText("");
file=new File(filePath,name);
BufferedReader br=null;
try
{
br=new BufferedReader(new FileReader(file));
String line=null;
while ((line=br.readLine())!=null)
{
ta.append(line+"\r\n");
}
}
catch (IOException e1)
{
throw new RuntimeException("读取失败");
}
finally
{
try
{
if (br!=null)
{
br.close();
}
}
catch (IOException e1)
{
System.out.println("读取流关闭失败");
}
}
}
});
        f.addWindowListener(new WindowAdapter()  
        {  
            public void windowClosing(WindowEvent e)  
            {  
                System.exit(0);  
            }  
        });  
gm.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});

}
public static void main(String[] args) 
{
new MenuDemo();
}
}这个程序实现了非常简易的记事本功能,只有保存,读取,和退出功能,但是如果不打开文件,而是直接在这个程序里的文本区域里写一些东西按保存后,这个文件是没有立刻出现的,而需要再一次按保存才出现,小弟实在不知道为什么。求大神解惑。(也就是说当我直接在文本区域里写了一些数据后,需要按2次保存才能看到这个文件的出现。)

解决方案 »

  1.   


    bm.addActionListener(new ActionListener()
             {
                public void actionPerformed(ActionEvent e)
                {
                    if(file==null)
                    {
                        save.setVisible(true);
                        String s1=save.getFile();
                        String s2=save.getDirectory();
                        if (s1==null||s2==null)
                        {
                            return;
                        }
                        file=new File(s2,s1);
                    }
                    else
                    {
                        BufferedWriter bw=null;
                        try
                        {
                            bw=new BufferedWriter(new FileWriter(file));
                            String s=ta.getText();
                            bw.write(s);
                            bw.flush();
                            bw.close();
                        }
                        catch (IOException e1)
                        {
                            throw new RuntimeException("写入失败");
                        }                }
                    
                }
             });==>bm.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if (file == null) {
    save.setVisible(true);
    String s1 = save.getFile();
    String s2 = save.getDirectory();
    if (s1 == null || s2 == null) {
    return;
    }
    file = new File(s2, s1);

    BufferedWriter bw = null;
    try {
    bw = new BufferedWriter(new FileWriter(file));
    String s = ta.getText();
    bw.write(s);
    bw.flush();
    bw.close();
    } catch (IOException e1) {
    throw new RuntimeException("写入失败");
    }
    }
    });
      

  2.   

     用了if,else 语句,所以第一次file=null,就跳过了。第二次报错才执行save操作,注释掉就好了。
     if(file==null)
                    {
                        save.setVisible(true);
                        String s1=save.getFile();
                        String s2=save.getDirectory();
                        if (s1==null||s2==null)
                        {
                            return;
                        }
                        file=new File(s2,s1);
                        if(!file.exists()){
    try {
    file.createNewFile();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    }
                    }
                   // else
                    //{
                        BufferedWriter bw=null;
                        try
                        {
                            bw=new BufferedWriter(new FileWriter(file));
                            String s=ta.getText();
                            bw.write(s);
                            bw.flush();
                            bw.close();
                        }
                        catch (IOException e1)
                        {
                            throw new RuntimeException("写入失败");
                        }                //}
      

  3.   

    简单的说,就是
    bm.addActionListener 中else 关键字 去掉(包括"{}").里面的内容保留
      

  4.   

    不可能吧,我这里测试好用。用了下面的代码吗?
    bm.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (file == null) {
                        save.setVisible(true);
                        String s1 = save.getFile();
                        String s2 = save.getDirectory();
                        if (s1 == null || s2 == null) {
                            return;
                        }
                        file = new File(s2, s1);
                    } 
                        BufferedWriter bw = null;
                        try {
                            bw = new BufferedWriter(new FileWriter(file));
                            String s = ta.getText();
                            bw.write(s);
                            bw.flush();
                            bw.close();
                        } catch (IOException e1) {
                            throw new RuntimeException("写入失败");
                        }
                }
            });
      

  5.   


    package menupack;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    public class  MenuDemo
    {
    private Frame f;
    private MenuBar mb;
    private Menu m;
    private MenuItem dm,gm,bm;
    private FileDialog open,save;
    private TextArea ta;
    private File file;
    MenuDemo()
    {
    init();
    }
    public void init()
    {
    f=new Frame("魔兽世界");
    mb=new MenuBar();
    m=new Menu("文件");
    dm=new MenuItem("打开");
    gm=new MenuItem("退出");
    bm=new MenuItem("保存");
    open=new FileDialog(f,"打开WoW",FileDialog.LOAD);
    save=new FileDialog(f,"关闭WoW",FileDialog.SAVE);
    ta=new TextArea();
    f.setBounds(300,100,600,600);
    //f.setLayout(new FlowLayout());使用默认布局,没设置东南西北,就填充了
    f.setMenuBar(mb);
    f.add(ta);
    mb.add(m);
    m.add(dm);
    m.add(bm);
    m.add(gm);
    myEvent();
    f.setVisible(true);
    }  private void myEvent()  
     {  
     /*bm.addActionListener(new ActionListener()
     {
    public void actionPerformed(ActionEvent e)
        {
    if(file==null)
    {
    save.setVisible(true);
    String s1=save.getFile();
    String s2=save.getDirectory();
    if (s1==null||s2==null)
    {
    return;
    }
    file=new File(s2,s1);
    }
    try
    {
    BufferedWriter bw=new BufferedWriter(new FileWriter(file));
    String s=ta.getText();
    bw.write(s);
    bw.flush();
    bw.close();
    }
    catch (IOException e1)
    {
    throw new RuntimeException("写入失败");
    }
    }
     });*/
      bm.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
      if (file == null) {
      save.setVisible(true);
      String s1 = save.getFile();
      String s2 = save.getDirectory();
      if (s1 == null || s2 == null) {
      return;
      }
      file = new File(s2, s1);
      }  
      BufferedWriter bw = null;
      try {
      bw = new BufferedWriter(new FileWriter(file));
      String s = ta.getText();
      bw.write(s);
      bw.flush();
      bw.close();
      } catch (IOException e1) {
      throw new RuntimeException("写入失败");
      }
      }
      });
    dm.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    open.setVisible(true);
    String filePath=open.getDirectory();
    String name=open.getFile();
    if (filePath==null||name==null)
    {
    return;
    }
    ta.setText("");
    file=new File(filePath,name);
    BufferedReader br=null;
    try
    {
    br=new BufferedReader(new FileReader(file));
    String line=null;
    while ((line=br.readLine())!=null)
    {
    ta.append(line+"\r\n");
    }
    }
    catch (IOException e1)
    {
    throw new RuntimeException("读取失败");
    }
    finally
    {
    try
    {
    if (br!=null)
    {
    br.close();
    }
    }
    catch (IOException e1)
    {
    System.out.println("读取流关闭失败");
    }
    }
    }
    });
            f.addWindowListener(new WindowAdapter()  
            {  
                public void windowClosing(WindowEvent e)  
                {  
                    System.exit(0);  
                }  
            });  
    gm.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    System.exit(0);
    }
    });

    }
    public static void main(String[] args) 
    {
    new MenuDemo();
    }
    }
    你瞧~
      

  6.   

    刚跑了一下,确实好用,说说我的STEP
    1) 运行
    2)输入文本:abc
    3)点击保存,弹出对话框,输入test.txt,点击保存按钮
    4)查看test.txt文件,有内容。 在JDK_HOME\lib 下
      

  7.   

    刚看到你信息,我测试了你8楼贴出来的代码,在我这工作正常,一次就能生成保存文件,且内容也正确。所以你的问题现在是啥?不过发现你一个小笔误:
    save=new FileDialog(f,"关闭WoW",FileDialog.SAVE);
      

  8.   

    小弟想知道这个else加和不加的区别在哪里
      

  9.   

    区别我觉得2楼说的比较清楚了。你实际上应该是当file==null的时候,是希望先创建file,然后再写入。但你用了else,那程序逻辑就变成创建file后,跳过写入动作了。这个应该不难理解吧?精简下逻辑,伪代码就是:
    if(file==null) {
      弹出文件选择对话框;
      打开用户选择的文件--> file
    } else {
      将内容写入file中。
    }
    明显这个else就是错误滴啊。
      

  10.   

    加了else ,第一次file=null,执行if语句,保存就先不执行了,第二次保存的时候就入else,才执行保存。帮你加了个,如果file不存在,创建一个新文件。