import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.text.*;
import javax.swing.undo.*;
public class Book
{
public static void main(String args[])
{
new TextPad();
}
}
class TextPad extends JFrame implements ActionListener
{
ResourceBundle rb = ResourceBundle.getBundle("XSN110",Locale.getDefault());
JTextArea jta=new JTextArea("该记事本由东北大学东软信息学院软件工程05509班 夏胜男编写,希望大家喜欢!",18,52); //18行,25列
JCheckBoxMenuItem mto1=new JCheckBoxMenuItem(rb.getString("Auto"),true); //可以被选定或取消选定的菜单项
String ss1=jta.getText();
UndoableEditListener ue=new UndoHander(); //该接口由某个对接收有关可撤消操作的消息感兴趣的类实现
UndoManager undo = new UndoManager();
int StartFindPos=0,a=0,b=0;
GridBagConstraints gbc=new GridBagConstraints(); //GridBagConstraints 类指定使用 GridBagLayout 类布置的组件的约束
public TextPad()
{
//component
this.setTitle("一个功能比较齐全的JAVA记事本");
this.setLocation(180,100); //将组件移到新位置。通过此组件父级坐标空间中的 x 和 y 参数来指定新位置的左上角
jta.setLineWrap(true); // 设置文本区的换行策略
jta.setWrapStyleWord(true);//设置换行方式
JPanel jp=new JPanel();
JScrollPane jsp=new JScrollPane(jta);
jp.add(jsp);
JMenu mf=new JMenu((String)rb.getObject("File"));
JMenuItem mtf1=new JMenuItem((String)rb.getObject("New"));
mtf1.addActionListener(this);
JMenuItem mtf2=new JMenuItem((String)rb.getObject("Open"));
mtf2.addActionListener(this);
JMenuItem mtf3=new JMenuItem((String)rb.getObject("Save"));
mtf3.addActionListener(this);
JMenuItem mtf4=new JMenuItem((String)rb.getObject("Save as"));
mtf4.addActionListener(this);
JMenuItem mtf5=new JMenuItem((String)rb.getObject("Exit"));
mtf5.addActionListener(this);
JMenu me=new JMenu((String)rb.getObject("Edit"));
JMenuItem mte1=new JMenuItem((String)rb.getObject("Cancel"));
mte1.addActionListener(this);
jta.getDocument().addUndoableEditListener(ue); //注册可撤消的编辑操作
if(undo.canUndo()) //canUndo 重写以保持常用语义:如果 undo 操作现在能够成功,则返回 true,否则返回 false
{
mte1.setEnabled(false);
}
JMenuItem mte2=new JMenuItem((String)rb.getObject("Cut"));
mte2.addActionListener(this);
JMenuItem mte3=new JMenuItem((String)rb.getObject("Copy"));
mte3.addActionListener(this);
JMenuItem mte4=new JMenuItem((String)rb.getObject("Paste"));
mte4.addActionListener(this);
JMenuItem mte6=new JMenuItem((String)rb.getObject("Find"));
mte6.addActionListener(this);
JMenuItem mte8=new JMenuItem((String)rb.getObject("Replace"));
mte8.addActionListener(this);
JMenuItem mte10=new JMenuItem((String)rb.getObject("Full"));
mte10.addActionListener(this);
JMenuItem mte11=new JMenuItem((String)rb.getObject("Date/Time"));
mte11.addActionListener(this);
JMenu mo=new JMenu((String)rb.getObject("Form"));
mto1.addActionListener(this);
JMenuItem mto2=new JMenuItem((String)rb.getObject("Font"));
mto2.addActionListener(this);
JMenu mv=new JMenu((String)rb.getObject("Examine"));
JMenuItem mtv1=new JMenuItem((String)rb.getObject("Status bar"));
mtv1.setEnabled(false);
JMenu mh=new JMenu((String)rb.getObject("Help"));
JMenuItem mth1=new JMenuItem((String)rb.getObject("About"));
mth1.addActionListener(this);
JMenuBar mb=new JMenuBar();
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
mb.add(mf);
mb.add(me);
mb.add(mo);
mb.add(mv);
mb.add(mh);
this.setJMenuBar(mb); //装菜单栏
mf.add(mtf1);
mf.add(mtf2);
mf.add(mtf3);
mf.add(mtf4);
mf.addSeparator(); //将新分隔符追加到菜单的末尾
mf.add(mtf5);
me.add(mte1);
me.addSeparator();
me.add(mte2);
me.add(mte3);
me.add(mte4);
me.addSeparator();
me.add(mte6);
me.add(mte8);
me.addSeparator();
me.add(mte10);
me.add(mte11);
mo.add(mto1);
mo.add(mto2);
mv.add(mtv1);
mh.add(mth1);
this.getContentPane().add(jsp);
this.setSize(600,400);
this.setResizable(true); //设置是否可以拖拽
this.setVisible(true); //设置其可见
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals(rb.getString("Open")))
{
try
{
Frame f=new Frame();
FileDialog fd=new FileDialog(f,"打开文件",FileDialog.LOAD); //对话框
fd.setVisible(true);
String fpath=fd.getDirectory(); //获得此文件对话框的目录
String fname=fd.getFile(); //获得此文件对话框的选定文件。如果用户选择 CANCEL,则返回文件为 null
BufferedReader br=new BufferedReader(new FileReader(fpath+fname));
jta.setText("");
String s=br.readLine();
while(s!=null)
{
jta.append(s+"\n");
s=br.readLine();
}
br.close();
}
catch(Exception ex)
{
}
}
if(e.getActionCommand().equals(rb.getString("save")))
{
String fns=null;
Frame f=new Frame("保存");
FileDialog fd=new FileDialog(f,"保存文件",FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);
try
{
String savepath=fd.getDirectory();
String savename=fd.getFile();
if(savename!=null)
{
PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter(savepath+savename)));
pw.write(jta.getText(),0,jta.getText().length()); //写入字符串的某一部分
pw.flush();
}
}
catch(Exception esave)
{
}
}
if(e.getActionCommand().equals(rb.getString("New")))
{
jta.setText("");
}
if(e.getActionCommand().equals("另存为"))
{
Frame f=new Frame("保存");
FileDialog fd=new FileDialog(f,"文件另存为",FileDialog.SAVE);
fd.setVisible(true);
try
{
String savepath=fd.getDirectory();
String savename=fd.getFile();
if(savename!=null)
{
PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter(savepath+savename)));
pw.write(jta.getText(),0,jta.getText().length());
pw.flush();
}
}
catch(Exception esave)
{
}
}
if(e.getActionCommand().equals(rb.getString("Exit")))
{
String ss2=jta.getText();
if(!ss1.equals(ss2))
{
System.out.println("File is changed.");
}
System.exit(0);
}
if(e.getActionCommand().equals(rb.getString("Cancel")))
{
try
{
undo.undo();
}
catch(Exception eundo)
{
}
}
if(e.getActionCommand().equals(rb.getString("Cut")))
{
jta.cut();
}
if(e.getActionCommand().equals(rb.getString("Copy")))
{
jta.copy();
}
if(e.getActionCommand().equals(rb.getString("Paste")))
{
jta.paste();
}
if(e.getActionCommand().equals("删除"))
{
}
if(e.getActionCommand().equals(rb.getString("Full")))
{
jta.selectAll();
}
if(e.getActionCommand().equals(rb.getString("Find")))
{
try
{
final JDialog jd=new JDialog(this,"查找",true);
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
gbc.weightx=0.5; // 指定如何分布额外的水平空间
gbc.weighty=0.5; // 指定如何分布额外的垂直空间
gbc.gridwidth=1; //指定在组件显示区域的一行中的单元格数
gbc.gridheight=1; //指定在组件显示区域的一列中的单元格数
jd.getContentPane().setLayout(gbl);
jd.setSize(380,100);
jd.setResizable(false);
final JTextField jtf=new JTextField(15);
JLabel jlFind=new JLabel("查找内容:");
jd.getContentPane().add(jlFind);
JButton jbFind=new JButton("查找");
jbFind.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent efind)
{
String strA=jta.get