首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于记事本程序的重复保存有关问题

2012-02-13 
关于记事本程序的重复保存问题Q:运行后,打开一个文档,再修改,按新建时,不会提示保存。因为全局变量num在打

关于记事本程序的重复保存问题
Q:运行后,打开一个文档,再修改,按新建时,不会提示保存。

因为全局变量num在打开时已置1,求教怎么修改,是不是有一个函数能将jta中的内容与原文件内容比较?





import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.*;




public class J2009 extends JFrame {

JFileChooser fc=new JFileChooser();
  File file=null;
  JTextArea jta;
  Color color = Color.lightGray;
  String s="2009- -Java程序设计综合实验";
  int num=0;
  
   
  public static void centerWindow(Window f){
  //获得桌面大小
  Toolkit tk=f.getToolkit();
  Dimension dm=tk.getScreenSize();
  f.setLocation((int)(dm.getWidth()-f.getWidth())/2,(int)(dm.getHeight()-f.getHeight())/2);
  }
   
   
  void saving(){
  try{
  FileWriter Writef=new FileWriter(file);
  Writef.write(jta.getText());
  Writef.close();
  num=1;
  }
  catch(Exception e){e.printStackTrace();}
  } 
   
   
  void judging(){
  if(num==0){
  if(!(jta.getText().equals(""))){
int option= JOptionPane.showConfirmDialog( 
  J2009.this, "是否要保存 ", "2009- -Java程序设计综合实验 ",JOptionPane.YES_NO_CANCEL_OPTION); 
  if(option==JOptionPane.YES_OPTION) 
  { 
  if(file!=null) fc.setSelectedFile(file);
  int returnVal=fc.showSaveDialog(J2009.this);
  if(returnVal==JFileChooser.APPROVE_OPTION){
  file=fc.getSelectedFile();
  saving();}

  else if(option==JOptionPane.NO_OPTION)
  {jta.setText("");} 
}
  }
  else jta.setText("");
  }
 

public J2009(){
this.setTitle(s);//标题未设定
jta=new JTextArea();
this.add(jta);
JMenuBar mb=new JMenuBar();
JMenu fileMenu=new JMenu("文件(F)");
fileMenu.setMnemonic(KeyEvent.VK_F);
JMenuItem newMenuItem=new JMenuItem("新建(N)");
newMenuItem.setMnemonic(KeyEvent.VK_N);
newMenuItem.addActionListener(new NewActionListener());
fileMenu.add(newMenuItem);
JMenuItem openMenuItem=new JMenuItem("打开(O)");
openMenuItem.setMnemonic(KeyEvent.VK_O);
openMenuItem.addActionListener(new OpenActionListener());
fileMenu.add(openMenuItem);
JMenuItem saveMenuItem=new JMenuItem("保存(S)");
saveMenuItem.setMnemonic(KeyEvent.VK_S);
saveMenuItem.addActionListener(new SaveActionListener());
fileMenu.add(saveMenuItem);
JMenuItem fontMenuItem=new JMenuItem("字体");
fileMenu.add(fontMenuItem);//字体未设定
JMenuItem colorMenuItem=new JMenuItem("背景颜色(C)");
colorMenuItem.setMnemonic(KeyEvent.VK_C);
colorMenuItem.addActionListener(new colorActionListener());
fileMenu.add(colorMenuItem);
JMenuItem exitMenuItem=new JMenuItem("退出(E)");
exitMenuItem.setMnemonic(KeyEvent.VK_E);
exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E ,ActionEvent.CTRL_MASK));
exitMenuItem.addActionListener(new ExitActionListener());
fileMenu.add(exitMenuItem);
JMenu menu2=new JMenu("Java上机题目");
JMenuItem item1=new JMenuItem("回文数");


//item1.addActionListener(new item1ActionListener());
menu2.add(item1);
JMenuItem item2=new JMenuItem("数字与英文互译");
menu2.add(item2);
JMenuItem item3=new JMenuItem("统计英文数据");
menu2.add(item3);
JMenuItem item4=new JMenuItem("文本文件求和");
menu2.add(item4);
mb.add(fileMenu);
mb.add(menu2);
this.setJMenuBar(mb);
this.setVisible(true);
this.setSize(300,400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
int option= JOptionPane.showConfirmDialog( 
J2009.this, "确定要退出系统? ", "2009- -Java程序设计综合实验 ",JOptionPane.YES_NO_OPTION); 
if(option==JOptionPane.YES_OPTION) 
if(e.getWindow() == J2009.this) 

System.exit(0); 

else 
{return; }
}
});}



class SaveActionListener implements ActionListener//保存
{
public void actionPerformed(ActionEvent e) {
if(file!=null) saving();
else{fc.setSelectedFile(file);
int returnVal=fc.showSaveDialog(J2009.this);
if(returnVal==JFileChooser.APPROVE_OPTION){
file=fc.getSelectedFile();
saving();}
String filename = fc.getSelectedFile().getPath();
  J2009.this.setTitle(s+'-'+filename);}

}
 
}
class OpenActionListener implements ActionListener//打开
{
public void actionPerformed(ActionEvent e) {

judging();
if(file !=null)fc.setSelectedFile(file);
int returnVal=fc.showOpenDialog(J2009.this);
if(returnVal==JFileChooser.APPROVE_OPTION){
file=fc.getSelectedFile();
 
String filename = fc.getSelectedFile().getPath();
  num=1;
 
J2009.this.setTitle(s+'-'+filename);
unfold();}}
void unfold(){
try{
FileReader Readf=new FileReader(file);
int len=(int)file.length();
char []buffer=new char[len];
Readf.read(buffer,0,len);
Readf.close();
jta.setText(new String(buffer));
}catch(Exception e){e.printStackTrace();}
}
 
}
class ExitActionListener implements ActionListener//退出
{  
public void actionPerformed(ActionEvent e) {
judging();
int option= JOptionPane.showConfirmDialog( 
J2009.this, "确定要退出系统? ", "2009- -Java程序设计综合实验 ",JOptionPane.YES_NO_OPTION); 
if(option==JOptionPane.YES_OPTION) 
 

System.exit(0); 

else 
{return; } 
}
}


class colorActionListener implements ActionListener//改变颜色
{
public void actionPerformed(ActionEvent e){
color = JColorChooser.showDialog(J2009.this,"Choose a color",color);
if(color == null )
color = Color.lightGray;
else jta.setBackground(color);
 
}
}
class NewActionListener implements ActionListener//新建
{
public void actionPerformed(ActionEvent e){
judging();
J2009.this.setTitle(s);



}
}
/*class item1ActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e){
 
}
}*/

  public static void main(String []args){
  J2009 ffff=new J2009();
   
 

   
}} 


[解决办法]
一种做法就是jta加个key监听,当jta的内容发生变化时,修改num=0

另一种做法就是用一个隐藏的jta或者String保存文件内容,在new事件中判断jta和隐藏的jta或String的内容是否一致,不一致则设置num=0

[解决办法]
抛砖引玉吧,LZ可以尝试使用下面打头的代码来实现这个功能:
jta.getDocument().addDocumentListener(new DocumentListener(){...});

热点排行