读书人

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

发布时间: 2012-02-13 17:20:26 作者: rapoo

关于记事本程序的重复保存问题
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(){...});

读书人网 >J2SE开发

热点推荐