用Java实现一个简单记事本的功能,菜单要求齐全,但不必全部实现功能。需要实现的主要是“文件”菜单中的“新建”,“打开”,“保存”和“退出”功能即可。快捷键的功能可以忽略。(写出代码并做六百字左右解释分析,并不需要太专业的讲解,最好今天能做出来)
java 记事本及其简单功能的实现其中包括保存、新建、等功能的实现。
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import java.io.*;
import javax.swing.undo.*;
import javafx.scene.input.InputEvent;
import javafx.scene.input.KeyEvent;
import javax.swing.border.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
import java.time.*;
public class Mynote extends JFrame implements ActionListener,DocumentListener{
JMenuBar bar;
JMenu cai1,cai2,cai3,cai4,cai5,cai41;
JMenuItem cai11,cai12,cai13,cai14,cai15,cai16,cai17,cai18,cai21,cai22,cai23,cai24,cai25,cai26,cai27,cai28,cai29,cai210,cai211,cai212,cai213,cai32,cai33,cai34,cai42,cai41_1,cai41_2,cai41_3,cai51,cai52,cai53,editMenu_Undo;
JTextArea text;
JPanel pa;
JScrollPane jsc;
FileReader fr;
BufferedReader br;
FileWriter fw,fw1;
BufferedWriter bw,bw1,out;
String str=null,oldValue;
File dir,currentFile,bcwjm;//currentFile当前文件名
JFileChooser jfc2;
JLabel label;
JCheckBoxMenuItem cai31;
//右键菜单项
JPopupMenu youcd;
JMenuItem cx,jq,fz,zt,sc,qx;
//系统剪切板
Toolkit toolkit=Toolkit.getDefaultToolkit();
Clipboard clipBoard=toolkit.getSystemClipboard();
//设置图标
ImageIcon image;
//撤销操作
protected UndoManager undo=new UndoManager();
protected UndoableEditListener undoHandler=new UndoHandler();
//判断是否是新文件
boolean isNewFile=true;
int a=0,b=0;
public Mynote() {
initGUI();
this.setBounds(500,300,600,400);
this.setVisible(true);
setDefaultCloseOperation(3);
this.setTitle("霖霖的记事本");
//改字体
Font ft = new Font("华文楷体",Font.PLAIN,14);
java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof javax.swing.plaf.FontUIResource) {
UIManager.put(key, ft);
}
}
//撤销
label = new JLabel("按F1查看帮助");
this.add(label,BorderLayout.SOUTH);
//添加左上角图片
image = new ImageIcon("my.jfif");
this.setIconImage(image.getImage());
//添加窗口侦听器
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
exitWindowChoose();
}
});
checkMenuItemEnabled();
text.requestFocus();
}
public void initGUI(){
bar = new JMenuBar();
cai1 = new JMenu("文件(F)");
cai1.setMnemonic('F');//设置快捷键ALT+F
cai2 = new JMenu("编辑(N)");
cai2.setMnemonic('N');
cai3 = new JMenu("格式(O)");
cai3.setMnemonic('O');
cai4 = new JMenu("查看(V)");
cai4.setMnemonic('V');
cai5 = new JMenu("帮助(H)");
cai5.setMnemonic('H');
cai11 = new JMenuItem("新建(N)");
cai11.setAccelerator(KeyStroke.getKeyStroke(78,2));
cai11.addActionListener(this);
cai12 = new JMenuItem("新窗口(W)");
cai12.addActionListener(this);
cai13 = new JMenuItem("打开(O)");
cai13.setAccelerator(KeyStroke.getKeyStroke(79,2));
cai13.addActionListener(this);
cai14 = new JMenuItem("保存(S)");
cai14.setAccelerator(KeyStroke.getKeyStroke(83,2));
cai14.addActionListener(this);
cai15 = new JMenuItem("另存为(A)");
cai15.addActionListener(this);
cai16 = new JMenuItem("页面设置(U)");
cai16.addActionListener(this);
cai17 = new JMenuItem("打印(P)");
cai17.addActionListener(this);
cai18 = new JMenuItem("退出(X)");
cai18.addActionListener(this);
cai21 = new JMenuItem("撤销(U)");
cai21.setAccelerator(KeyStroke.getKeyStroke(90,2));
cai21.addActionListener(this);
cai21.setEnabled(false);
cai22 = new JMenuItem("剪切(T)");
cai22.setAccelerator(KeyStroke.getKeyStroke(88,2));
cai22.addActionListener(this);
cai23 = new JMenuItem("复制(C)");
cai23.setAccelerator(KeyStroke.getKeyStroke(67,2));
cai23.addActionListener(this);
cai24 = new JMenuItem("粘贴(P)");
cai24.setAccelerator(KeyStroke.getKeyStroke(86,2));
cai24.addActionListener(this);
cai25 = new JMenuItem("删除(L)");
cai25.setAccelerator(KeyStroke.getKeyStroke(127,0));
cai25.addActionListener(this);
cai26 = new JMenuItem("使用 Bing 搜索...");
cai26.addActionListener(this);
cai27 = new JMenuItem("查找(F)");
cai27.addActionListener(this);
cai28 = new JMenuItem("查找上一个(N)");
cai28.addActionListener(this);
cai29 = new JMenuItem("查找下一个(V)");
cai29.addActionListener(this);
cai210 = new JMenuItem("替换(R)...");
cai210.addActionListener(this);
cai211 = new JMenuItem("(转到G)...");
cai211.addActionListener(this);
cai212 = new JMenuItem("全选(A)");
cai212.setAccelerator(KeyStroke.getKeyStroke(65, 2));
cai212.addActionListener(this);
cai213 = new JMenuItem("时间/日期(D)");
cai213.setAccelerator(KeyStroke.getKeyStroke(116,0));
cai213.addActionListener(this);
cai31 = new JCheckBoxMenuItem("自动换行(W)");
cai31.setMnemonic('W');
cai31.setState(true);
cai31.addActionListener(this);
cai32 = new JMenuItem("字体(F)");
cai32.addActionListener(this);
cai33 = new JMenuItem("前景色");
cai33.addActionListener(this);
cai34 = new JMenuItem("背景色");
cai34.addActionListener(this);
cai41 = new JMenu("缩放(Z)");
cai41.addActionListener(this);
cai42 = new JMenuItem("状态栏(S)");
cai42.addActionListener(this);
cai41_1 = new JMenuItem("放大(I)");
cai41_1.addActionListener(this);
cai41_2 = new JMenuItem("缩小(O)");
cai41_2.addActionListener(this);
cai41_3 = new JMenuItem("恢复默认缩放(O)");
cai41_3.addActionListener(this);
cai51 = new JMenuItem("查看帮助(H)");
cai51.setAccelerator(KeyStroke.getKeyStroke(112,0));
cai51.addActionListener(this);
cai52 = new JMenuItem("发送反馈(F)");
cai52.addActionListener(this);
cai53 = new JMenuItem("关于记事本(A)");
cai53.addActionListener(this);
cai1.add(cai11);
cai1.add(cai12);
cai1.add(cai13);
cai1.add(cai14);
cai1.add(cai15);
cai1.add(cai16);
cai1.add(cai17);
cai1.add(cai18);
cai2.add(cai21);
cai2.add(cai22);
cai2.add(cai23);
cai2.add(cai24);
cai2.add(cai25);
cai2.add(cai26);
cai2.add(cai27);
cai2.add(cai28);
cai2.add(cai29);
cai2.add(cai210);
cai2.add(cai211);
cai2.add(cai212);
cai2.add(cai213);
cai3.add(cai31);
cai3.add(cai32);
cai3.add(cai33);
cai3.add(cai34);
cai41.add(cai41_1);
cai41.add(cai41_2);
cai41.add(cai41_3);
cai4.add(cai41);
cai4.add(cai42);
cai5.add(cai51);
cai5.add(cai52);
cai5.add(cai53);
bar.add(cai1);
bar.add(cai2);
bar.add(cai3);
bar.add(cai4);
bar.add(cai5);
this.setJMenuBar(bar);
text = new JTextArea(16,19);
Font font = new Font("微软雅黑",Font.BOLD,20);
text.setFont(font);
text.setEnabled(true);
//编辑区注册事件监听(与撤销操作有关)
text.getDocument().addUndoableEditListener(undoHandler);
text.getDocument().addDocumentListener(this);
//创建右键菜单
youcd = new JPopupMenu();
cx = new JMenuItem("撤销(U)");
jq = new JMenuItem("剪切(T)");
fz = new JMenuItem("复制(C)");
zt = new JMenuItem("粘帖(P)");
sc = new JMenuItem("删除(D)");
qx = new JMenuItem("全选(A)");
cx.setEnabled(false);
youcd.add(cx);
youcd.addSeparator();
youcd.add(jq);
youcd.add(fz);
youcd.add(zt);
youcd.add(sc);
youcd.addSeparator();
youcd.add(qx);
cx.addActionListener(this);
jq.addActionListener(this);
fz.addActionListener(this);
zt.addActionListener(this);
sc.addActionListener(this);
qx.addActionListener(this);
//创建编辑菜单及菜单项并注册事件监听
text.addMouseListener(new MouseAdapter()
{ public void mousePressed(MouseEvent e)
{ if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件
{ youcd.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性
text.requestFocus();//编辑区获取焦点
}
public void mouseReleased(MouseEvent e)
{ if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件
{ youcd.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性
text.requestFocus();//编辑区获取焦点
}
});
pa = new JPanel();
BorderLayout grid = new BorderLayout();
pa.setLayout(grid);
//设置光标可用性为true
text.getCaret().setVisible(true);
//设置光标位置为文本最后面
text.setCaretPosition(text.getText().length());
if(text.getText().equals("输入用户名")){
text.setText("");
}
else//全选文本框
text.selectAll();
pa.add(text);
//JScorllPane添加滚动条
jsc = new JScrollPane(text);
pa.add(jsc);
//获取原文内容方便比较
oldValue=text.getText();
this.add(pa);
cai2.addMenuListener(new MenuListener(){
public void menuCanceled(MenuEvent e)//取消菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuDeselected(MenuEvent e)//取消选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuSelected(MenuEvent e)//选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
});
}
//设置复制、粘贴等功能的可用性
public void checkMenuItemEnabled()
{ String selectText=text.getSelectedText();
if(selectText==null)
{ cai22.setEnabled(false);
cai23.setEnabled(false);
cai25.setEnabled(false);
fz.setEnabled(false);
zt.setEnabled(false);
jq.setEnabled(false);
}
else
{ cai22.setEnabled(true);
cai23.setEnabled(true);
cai25.setEnabled(true);
fz.setEnabled(true);
zt.setEnabled(true);
jq.setEnabled(true);
}
//粘帖功能可用性判断
Transferable contents=clipBoard.getContents(this);
if(contents==null){
cai24.setEnabled(false);
zt.setEnabled(false);
}
else
{ cai24.setEnabled(true);
zt.setEnabled(true);
}
}
public void font()
{ final JDialog fontDialog=new JDialog(this,"字体设置",false);
Container con=fontDialog.getContentPane();
con.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel fontLabel=new JLabel("字体(F):");
fontLabel.setPreferredSize(new Dimension(100,20));//构造一个Dimension,并将其初始化为指定宽度和高度
JLabel styleLabel=new JLabel("字形(Y):");
styleLabel.setPreferredSize(new Dimension(100,20));
JLabel sizeLabel=new JLabel("大小(S):");
sizeLabel.setPreferredSize(new Dimension(100,20));
final JLabel sample=new JLabel("张选仲的记事本-ZXZ's Notepad");
//sample.setHorizontalAlignment(SwingConstants.CENTER);
final JTextField fontText=new JTextField(9);
fontText.setPreferredSize(new Dimension(200,20));
final JTextField styleText=new JTextField(8);
styleText.setPreferredSize(new Dimension(200,20));
final int style[]={Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};
final JTextField sizeText=new JTextField(5);
sizeText.setPreferredSize(new Dimension(200,20));
JButton okButton=new JButton("确定");
JButton cancel=new JButton("取消");
cancel.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ fontDialog.dispose();
}
});
Font currentFont=text.getFont();
fontText.setText(currentFont.getFontName());
fontText.selectAll();
//styleText.setText(currentFont.getStyle());
//styleText.selectAll();
if(currentFont.getStyle()==Font.PLAIN)
styleText.setText("常规");
else if(currentFont.getStyle()==Font.BOLD)
styleText.setText("粗体");
else if(currentFont.getStyle()==Font.ITALIC)
styleText.setText("斜体");
else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
styleText.setText("粗斜体");
styleText.selectAll();
String str=String.valueOf(currentFont.getSize());
sizeText.setText(str);
sizeText.selectAll();
final JList fontList,styleList,sizeList;
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
final String fontName[]=ge.getAvailableFontFamilyNames();
fontList=new JList(fontName);
fontList.setFixedCellWidth(86);
fontList.setFixedCellHeight(20);
fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final String fontStyle[]={"常规","粗体","斜体","粗斜体"};
styleList=new JList(fontStyle);
styleList.setFixedCellWidth(86);
styleList.setFixedCellHeight(20);
styleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if(currentFont.getStyle()==Font.PLAIN)
styleList.setSelectedIndex(0);
else if(currentFont.getStyle()==Font.BOLD)
styleList.setSelectedIndex(1);
else if(currentFont.getStyle()==Font.ITALIC)
styleList.setSelectedIndex(2);
else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
styleList.setSelectedIndex(3);
final String fontSize[]={"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};
sizeList=new JList(fontSize);
sizeList.setFixedCellWidth(43);
sizeList.setFixedCellHeight(20);
sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fontList.addListSelectionListener(new ListSelectionListener()
{ public void valueChanged(ListSelectionEvent event)
{ fontText.setText(fontName[fontList.getSelectedIndex()]);
fontText.selectAll();
Font sampleFont1=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
sample.setFont(sampleFont1);
}
});
styleList.addListSelectionListener(new ListSelectionListener()
{ public void valueChanged(ListSelectionEvent event)
{ int s=style[styleList.getSelectedIndex()];
styleText.setText(fontStyle[s]);
styleText.selectAll();
Font sampleFont2=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
sample.setFont(sampleFont2);
}
});
sizeList.addListSelectionListener(new ListSelectionListener()
{ public void valueChanged(ListSelectionEvent event)
{ sizeText.setText(fontSize[sizeList.getSelectedIndex()]);
//sizeText.requestFocus();
sizeText.selectAll();
Font sampleFont3=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
sample.setFont(sampleFont3);
}
});
okButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ Font okFont=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
text.setFont(okFont);
fontDialog.dispose();
}
});
JPanel samplePanel=new JPanel();
samplePanel.setBorder(BorderFactory.createTitledBorder("示例"));
//samplePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
samplePanel.add(sample);
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
panel2.add(fontText);
panel2.add(styleText);
panel2.add(sizeText);
panel2.add(okButton);
panel3.add(new JScrollPane(fontList));//JList不支持直接滚动,所以要让JList作为JScrollPane的视口视图
panel3.add(new JScrollPane(styleList));
panel3.add(new JScrollPane(sizeList));
panel3.add(cancel);
con.add(panel1);
con.add(panel2);
con.add(panel3);
con.add(samplePanel);
fontDialog.setSize(350,340);
fontDialog.setLocation(200,200);
fontDialog.setResizable(false);
fontDialog.setVisible(true);
}
public void exitWindowChoose()//关闭窗口时判断方法
{ text.requestFocus();
String str1=text.getText();
if(str1.equals(oldValue)==true)
{ System.exit(0);
}
else
{ int exitChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","退出提示",JOptionPane.YES_NO_CANCEL_OPTION);
if(exitChoose==JOptionPane.YES_OPTION)
{ //boolean isSave=false;
if(isNewFile)
{
String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result=fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ label.setText(" 您没有保存文件");
return;
}
File saveFileName=fileChooser.getSelectedFile();
if(saveFileName==null||saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileWriter fw3=new FileWriter(saveFileName);
BufferedWriter bw3=new BufferedWriter(fw3);
bw3.write(text.getText(),0,text.getText().length());
bw3.flush();
fw3.close();
isNewFile=false;
currentFile=saveFileName;
oldValue=text.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
label.setText(" 当前打开文件:"+saveFileName.getAbsoluteFile());
//isSave=true;
}
catch(IOException ioException){
}
}
}
else
{
try
{ FileWriter fw4=new FileWriter(currentFile);
BufferedWriter bw4=new BufferedWriter(fw4);
bw4.write(text.getText(),0,text.getText().length());
bw4.flush();
fw4.close();
//isSave=true;
}
catch(IOException ioException){
}
}
System.exit(0);
//if(isSave)System.exit(0);
//else return;
}
else if(exitChoose==JOptionPane.NO_OPTION)
{ System.exit(0);
}
else
{ return;
}
}
}
public void save(){//保存方法
jfc2 = new JFileChooser();
jfc2.setDialogTitle("另存为...");
int state=jfc2.showSaveDialog(this);
bcwjm=jfc2.getSelectedFile();//获取第一次保存文件夹的路径及原名
if(state==JFileChooser.APPROVE_OPTION){
try{
dir=jfc2.getCurrentDirectory();
str=jfc2.getSelectedFile().getName();
File file = new File(dir,str);
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
bw.write(text.getText());
bw.close();
fw.close();
}
catch(IOException exp){}
}
}
public void actionPerformed(ActionEvent e){
String str=e.getActionCommand();
if(str.equals("新建(N)")){
text.requestFocus();//获取焦点
String str1 = text.getText();
boolean textIsChange = (str1.equals(oldValue))?false:true;//判断是否改变文件
if(textIsChange){
int saveChoose = JOptionPane.showConfirmDialog(this,"你的文件未保存","提示",JOptionPane.YES_NO_CANCEL_OPTION);
if(saveChoose==JOptionPane.YES_OPTION){
String st=null;
JFileChooser file = new JFileChooser();
file.setFileSelectionMode(JFileChooser.FILES_ONLY);
file.setDialogTitle("另存为");
int result=file.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION){
label.setText("你没有选择文件");
return;
}
//获取保存文件名
File saveFileName=file.getSelectedFile();
if(saveFileName==null || saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法文件名","不合法文件名",JOptionPane.ERROR_MESSAGE);
}
else{
try
{ FileWriter fw2=new FileWriter(saveFileName);
BufferedWriter bw2=new BufferedWriter(fw2);
bw2.write(text.getText(),0,text.getText().length());
bw2.flush();//刷新该流的缓冲
bw2.close();
isNewFile=false;
currentFile=saveFileName;
oldValue=text.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
label.setText("当前打开文件:"+saveFileName.getAbsoluteFile());
}
catch (IOException ioException)
{
}
}
}
else if(saveChoose==JOptionPane.NO_OPTION)
{ text.replaceRange("",0,text.getText().length());
label.setText("新建文件");
this.setTitle("无标题——记事本");
isNewFile=true;
undo.discardAllEdits(); //撤销所有已“撤销”的操作
cai21.setEnabled(false);
oldValue=text.getText();
}
else if(saveChoose==JOptionPane.CANCEL_OPTION){
return;
}
}
else
{ text.replaceRange("",0,text.getText().length());
label.setText(" 新建文件");
this.setTitle("无标题——记事本");
isNewFile=true;
undo.discardAllEdits();//撤销所有已“撤销”的操作
cai21.setEnabled(false);
oldValue=text.getText();
}
}
else if(str.equals("新窗口(W)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("打开(O)")){
this.setVisible(true);
JFileChooser jfc1=new JFileChooser();
jfc1.setDialogTitle("打开文件...");
//默认方式
jfc1.showOpenDialog(null);
//显示
jfc1.setVisible(true);
//得到文件路径
String filename=jfc1.getSelectedFile().getAbsolutePath();
try{
fr=new FileReader(filename);
br=new BufferedReader(fr);
//从文件中循环读取,并显示到text中
String s="";
String sus="";
while((s=br.readLine())!=null)
{
//显示到text中
sus+=s+"\r\n";
}
text.setText(sus);
}
catch(Exception e1){
e1.printStackTrace();
}
finally
{
try {
fr.close();
br.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
else if(str.equals("保存(S)")){
/* //设置弹出对话框
JFileChooser jfc2=new JFileChooser();
jfc2.setDialogTitle("另存为...");
//默认显示方式
jfc2.showSaveDialog(null);
jfc2.setVisible(true);
//获取文件保存路径
String filename2=jfc2.getSelectedFile().getAbsolutePath();
//写人
fw=null;
bw=null;
try {
fw=new FileWriter(filename2);
bw=new BufferedWriter(fw);
bw.write(this.text.getText());
} catch (Exception e3) {
e3.printStackTrace();
}
finally
{
try {
bw.close();
fw.close();
} catch (Exception e4) {
e4.printStackTrace();
}
}
}*/
if(a==0&&b==0){
save();
a=1;
}
if(a==1&&b==1){
try{
//File file = new File(dir,str);
fw1 = new FileWriter(bcwjm);
bw1 = new BufferedWriter(fw1);
bw1.write(text.getText());
bw1.close();
fw1.close();
currentFile=bcwjm;
oldValue=text.getText();
this.setTitle(bcwjm.getName()+"记事本");
label.setText("当前打开文件:"+bcwjm.getAbsoluteFile());
}
catch(IOException exp){}
}
b=1;
}
else if(str.equals("另存为(A)")){
save();
}
else if(str.equals("页面设置(U)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚且无此功能");
}
else if(str.equals("打印(P)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("退出(X)")){
System.exit(0);
}
else if(str.equals("撤销(U)")){
text.requestFocus();
if(undo.canUndo())
{ try
{ undo.undo();
}
catch (CannotUndoException ex)
{ System.out.println("Unable to undo:" + ex);
//ex.printStackTrace();
}
}
if(!undo.canUndo())
{ editMenu_Undo.setEnabled(false);
}
}
else if(str.equals("剪切(T)")){
text.cut();
}
else if(str.equals("复制(C)")){
/*text.requestFocus();
String str3=text.getSelectedText();
StringSelection selection=new StringSelection(str3);
clipBoard.setContents(selection,null);*/
text.copy();
}
else if(str.equals("粘贴(P)")){
text.paste();
}
else if(str.equals("删除(L)")){
text.replaceSelection(null);
}
else if(str.equals("使用 Bing 搜索...")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}else if(str.equals("查找(F)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("查找上一个(N)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("查找下一个(V)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("替换(R)...")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("转到(G)...")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("全选(A)")){
text.selectAll();
}
else if(str.equals("时间/日期(D)")){
LocalDateTime date = LocalDateTime.now();
text.setText(date.toString());
}else if(str.equals("自动换行(W)")){
if(cai31.getState())
text.setLineWrap(true);
else
text.setLineWrap(false);
}
else if(str.equals("字体(F)")){
text.requestFocus();
font();
}
else if(str.equals("前景色")){
Color newColor1 = JColorChooser.showDialog(this,"选择你所喜欢的前景颜色",text.getForeground());
if(newColor1!=null){
text.setForeground(newColor1);
}
}
else if(str.equals("背景色")){
Color newColor = JColorChooser.showDialog(this,"选择你所喜欢的背景颜色",text.getBackground());
if(newColor!=null){
text.setBackground(newColor);
}
}
else if(str.equals("缩放(Z)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("状态栏(S)")){
}
else if(str.equals("放大(I)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("缩小(O)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("恢复默认缩放")){
text.requestFocus();
JOptionPane.showMessageDialog(this,"尚无此功能");
}
else if(str.equals("查看帮助(H)")){
try {
String url = "https://i.csdn.net/#/uc/profile";
java.net.URI uri = java.net.URI.create(url);
java.awt.Desktop dp = java.awt.Desktop.getDesktop();
if (dp.isSupported(java.awt.Desktop.Action.BROWSE)) {
dp.browse(uri);
}
} catch (java.lang.NullPointerException e5) {
e5.printStackTrace();
} catch (java.io.IOException e5) {
e5.printStackTrace();
}
}
else if(str.equals("关于反馈(F)")){
}
else if(str.equals("关于记事本(A)")){
text.requestFocus();
JOptionPane.showMessageDialog(this,
"///—————————————————————《欢迎使用霖霖记事本》————————————————————///\n"+
"——————————————————————————————————————————————————————\n"+
"创作人:鲜霖\n"+
"e-mail:linxian479@gmail.com\n"+
"———1589861957@qq.com\n"+
"创作时间:2020年6月20日\n"+
"vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n",
"记事本",JOptionPane.INFORMATION_MESSAGE);
}
}
public void removeUpdate(DocumentEvent e)
{ cai21.setEnabled(true);
}
public void insertUpdate(DocumentEvent e)
{ cai21.setEnabled(true);
}
public void changedUpdate(DocumentEvent e)
{ cai21.setEnabled(true);
}//DocumentListener结束
class UndoHandler implements UndoableEditListener
{ public void undoableEditHappened(UndoableEditEvent uee)
{ undo.addEdit(uee.getEdit());
}
}
}
// 主类
import data.*;
public class Xiaoxiaonote {
public static void main(String [] args){
Mynote s = new Mynote();
}
}
今天给大家介绍一下关于如何用Java实现记事本功能,是学习Java swing的一个非常好的案例,下面先看一下运行结果(下载地址在最下面):
下面我们来看源码:
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import java.io.*;
import javax.swing.undo.*;
import javax.swing.border.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
public class Notepad extends JFrame implements ActionListener,DocumentListener
{ //菜单
JMenu fileMenu,editMenu,formatMenu,viewMenu,helpMenu;
//右键弹出菜单项
JPopupMenu popupMenu;
JMenuItem popupMenu_Undo,popupMenu_Cut,popupMenu_Copy,popupMenu_Paste,popupMenu_Delete,popupMenu_SelectAll;
//“文件”的菜单项
JMenuItem fileMenu_New,fileMenu_Open,fileMenu_Save,fileMenu_SaveAs,fileMenu_PageSetUp,fileMenu_Print,fileMenu_Exit;
//“编辑”的菜单项
JMenuItem editMenu_Undo,editMenu_Cut,editMenu_Copy,editMenu_Paste,editMenu_Delete,editMenu_Find,editMenu_FindNext,editMenu_Replace,editMenu_GoTo,editMenu_SelectAll,editMenu_TimeDate;
//“格式”的菜单项
JCheckBoxMenuItem formatMenu_LineWrap;
JMenuItem formatMenu_Font;
//“查看”的菜单项
JCheckBoxMenuItem viewMenu_Status;
//“帮助”的菜单项
JMenuItem helpMenu_HelpTopics,helpMenu_AboutNotepad;
//“文本”编辑区域
JTextArea editArea;
//状态栏标签
JLabel statusLabel;
//系统剪贴板
Toolkit toolkit=Toolkit.getDefaultToolkit();
Clipboard clipBoard=toolkit.getSystemClipboard();
//创建撤销操作管理器(与撤销操作有关)
protected UndoManager undo=new UndoManager();
protected UndoableEditListener undoHandler=new UndoHandler();
//其他变量
String oldValue;//存放编辑区原来的内容,用于比较文本是否有改动
boolean isNewFile=true;//是否新文件(未保存过的)
File currentFile;//当前文件名
//构造函数开始
public Notepad()
{
super("Java记事本");
//改变系统默认字体
Font font = new Font("Dialog", Font.PLAIN, 12);
java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof javax.swing.plaf.FontUIResource) {
UIManager.put(key, font);
}
}
//创建菜单条
JMenuBar menuBar=new JMenuBar();
//创建文件菜单及菜单项并注册事件监听
fileMenu=new JMenu("文件(F)");
fileMenu.setMnemonic('F');//设置快捷键ALT+F
fileMenu_New=new JMenuItem("新建(N)");
fileMenu_New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
fileMenu_New.addActionListener(this);
fileMenu_Open=new JMenuItem("打开(O)...");
fileMenu_Open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
fileMenu_Open.addActionListener(this);
fileMenu_Save=new JMenuItem("保存(S)");
fileMenu_Save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
fileMenu_Save.addActionListener(this);
fileMenu_SaveAs=new JMenuItem("另存为(A)...");
fileMenu_SaveAs.addActionListener(this);
fileMenu_PageSetUp=new JMenuItem("页面设置(U)...");
fileMenu_PageSetUp.addActionListener(this);
fileMenu_Print=new JMenuItem("打印(P)...");
fileMenu_Print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
fileMenu_Print.addActionListener(this);
fileMenu_Exit=new JMenuItem("退出(X)");
fileMenu_Exit.addActionListener(this);
//创建编辑菜单及菜单项并注册事件监听
editMenu=new JMenu("编辑(E)");
editMenu.setMnemonic('E');//设置快捷键ALT+E
//当选择编辑菜单时,设置剪切、复制、粘贴、删除等功能的可用性
editMenu.addMenuListener(new MenuListener()
{ public void menuCanceled(MenuEvent e)//取消菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuDeselected(MenuEvent e)//取消选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuSelected(MenuEvent e)//选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
});
editMenu_Undo=new JMenuItem("撤销(U)");
editMenu_Undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));
editMenu_Undo.addActionListener(this);
editMenu_Undo.setEnabled(false);
editMenu_Cut=new JMenuItem("剪切(T)");
editMenu_Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
editMenu_Cut.addActionListener(this);
editMenu_Copy=new JMenuItem("复制(C)");
editMenu_Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
editMenu_Copy.addActionListener(this);
editMenu_Paste=new JMenuItem("粘贴(P)");
editMenu_Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
editMenu_Paste.addActionListener(this);
editMenu_Delete=new JMenuItem("删除(D)");
editMenu_Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
editMenu_Delete.addActionListener(this);
editMenu_Find=new JMenuItem("查找(F)...");
editMenu_Find.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));
editMenu_Find.addActionListener(this);
editMenu_FindNext=new JMenuItem("查找下一个(N)");
editMenu_FindNext.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
editMenu_FindNext.addActionListener(this);
editMenu_Replace = new JMenuItem("替换(R)...",'R');
editMenu_Replace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
editMenu_Replace.addActionListener(this);
editMenu_GoTo = new JMenuItem("转到(G)...",'G');
editMenu_GoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
editMenu_GoTo.addActionListener(this);
editMenu_SelectAll = new JMenuItem("全选",'A');
editMenu_SelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
editMenu_SelectAll.addActionListener(this);
editMenu_TimeDate = new JMenuItem("时间/日期(D)",'D');
editMenu_TimeDate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
editMenu_TimeDate.addActionListener(this);
//创建格式菜单及菜单项并注册事件监听
formatMenu=new JMenu("格式(O)");
formatMenu.setMnemonic('O');//设置快捷键ALT+O
formatMenu_LineWrap=new JCheckBoxMenuItem("自动换行(W)");
formatMenu_LineWrap.setMnemonic('W');//设置快捷键ALT+W
formatMenu_LineWrap.setState(true);
formatMenu_LineWrap.addActionListener(this);
formatMenu_Font=new JMenuItem("字体(F)...");
formatMenu_Font.addActionListener(this);
//创建查看菜单及菜单项并注册事件监听
viewMenu=new JMenu("查看(V)");
viewMenu.setMnemonic('V');//设置快捷键ALT+V
viewMenu_Status=new JCheckBoxMenuItem("状态栏(S)");
viewMenu_Status.setMnemonic('S');//设置快捷键ALT+S
viewMenu_Status.setState(true);
viewMenu_Status.addActionListener(this);
//创建帮助菜单及菜单项并注册事件监听
helpMenu = new JMenu("帮助(H)");
helpMenu.setMnemonic('H');//设置快捷键ALT+H
helpMenu_HelpTopics = new JMenuItem("帮助主题(H)");
helpMenu_HelpTopics.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
helpMenu_HelpTopics.addActionListener(this);
helpMenu_AboutNotepad = new JMenuItem("关于记事本(A)");
helpMenu_AboutNotepad.addActionListener(this);
//向菜单条添加"文件"菜单及菜单项
menuBar.add(fileMenu);
fileMenu.add(fileMenu_New);
fileMenu.add(fileMenu_Open);
fileMenu.add(fileMenu_Save);
fileMenu.add(fileMenu_SaveAs);
fileMenu.addSeparator(); //分隔线
fileMenu.add(fileMenu_PageSetUp);
fileMenu.add(fileMenu_Print);
fileMenu.addSeparator(); //分隔线
fileMenu.add(fileMenu_Exit);
//向菜单条添加"编辑"菜单及菜单项
menuBar.add(editMenu);
editMenu.add(editMenu_Undo);
editMenu.addSeparator(); //分隔线
editMenu.add(editMenu_Cut);
editMenu.add(editMenu_Copy);
editMenu.add(editMenu_Paste);
editMenu.add(editMenu_Delete);
editMenu.addSeparator(); //分隔线
editMenu.add(editMenu_Find);
editMenu.add(editMenu_FindNext);
editMenu.add(editMenu_Replace);
editMenu.add(editMenu_GoTo);
editMenu.addSeparator(); //分隔线
editMenu.add(editMenu_SelectAll);
editMenu.add(editMenu_TimeDate);
//向菜单条添加"格式"菜单及菜单项
menuBar.add(formatMenu);
formatMenu.add(formatMenu_LineWrap);
formatMenu.add(formatMenu_Font);
//向菜单条添加"查看"菜单及菜单项
menuBar.add(viewMenu);
viewMenu.add(viewMenu_Status);
//向菜单条添加"帮助"菜单及菜单项
menuBar.add(helpMenu);
helpMenu.add(helpMenu_HelpTopics);
helpMenu.addSeparator();
helpMenu.add(helpMenu_AboutNotepad);
//向窗口添加菜单条
this.setJMenuBar(menuBar);
//创建文本编辑区并添加滚动条
editArea=new JTextArea(20,50);
JScrollPane scroller=new JScrollPane(editArea);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scroller,BorderLayout.CENTER);//向窗口添加文本编辑区
editArea.setWrapStyleWord(true);//设置单词在一行不足容纳时换行
editArea.setLineWrap(true);//设置文本编辑区自动换行默认为true,即会"自动换行"
//this.add(editArea,BorderLayout.CENTER);//向窗口添加文本编辑区
oldValue=editArea.getText();//获取原文本编辑区的内容
//编辑区注册事件监听(与撤销操作有关)
editArea.getDocument().addUndoableEditListener(undoHandler);
editArea.getDocument().addDocumentListener(this);
//创建右键弹出菜单
popupMenu=new JPopupMenu();
popupMenu_Undo=new JMenuItem("撤销(U)");
popupMenu_Cut=new JMenuItem("剪切(T)");
popupMenu_Copy=new JMenuItem("复制(C)");
popupMenu_Paste=new JMenuItem("粘帖(P)");
popupMenu_Delete=new JMenuItem("删除(D)");
popupMenu_SelectAll=new JMenuItem("全选(A)");
popupMenu_Undo.setEnabled(false);
//向右键菜单添加菜单项和分隔符
popupMenu.add(popupMenu_Undo);
popupMenu.addSeparator();
popupMenu.add(popupMenu_Cut);
popupMenu.add(popupMenu_Copy);
popupMenu.add(popupMenu_Paste);
popupMenu.add(popupMenu_Delete);
popupMenu.addSeparator();
popupMenu.add(popupMenu_SelectAll);
//文本编辑区注册右键菜单事件
popupMenu_Undo.addActionListener(this);
popupMenu_Cut.addActionListener(this);
popupMenu_Copy.addActionListener(this);
popupMenu_Paste.addActionListener(this);
popupMenu_Delete.addActionListener(this);
popupMenu_SelectAll.addActionListener(this);
//文本编辑区注册右键菜单事件
editArea.addMouseListener(new MouseAdapter()
{ public void mousePressed(MouseEvent e)
{ if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件
{ popupMenu.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性
editArea.requestFocus();//编辑区获取焦点
}
public void mouseReleased(MouseEvent e)
{ if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件
{ popupMenu.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性
editArea.requestFocus();//编辑区获取焦点
}
});//文本编辑区注册右键菜单事件结束
//创建和添加状态栏
statusLabel=new JLabel(" 按F1获取帮助");
this.add(statusLabel,BorderLayout.SOUTH);//向窗口添加状态栏标签
//设置窗口在屏幕上的位置、大小和可见性
this.setLocation(100,100);
this.setSize(650,550);
this.setVisible(true);
//添加窗口监听器
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ exitWindowChoose();
}
});
checkMenuItemEnabled();
editArea.requestFocus();
}//构造函数Notepad结束
//设置菜单项的可用性:剪切,复制,粘帖,删除功能
public void checkMenuItemEnabled()
{ String selectText=editArea.getSelectedText();
if(selectText==null)
{ editMenu_Cut.setEnabled(false);
popupMenu_Cut.setEnabled(false);
editMenu_Copy.setEnabled(false);
popupMenu_Copy.setEnabled(false);
editMenu_Delete.setEnabled(false);
popupMenu_Delete.setEnabled(false);
}
else
{ editMenu_Cut.setEnabled(true);
popupMenu_Cut.setEnabled(true);
editMenu_Copy.setEnabled(true);
popupMenu_Copy.setEnabled(true);
editMenu_Delete.setEnabled(true);
popupMenu_Delete.setEnabled(true);
}
//粘帖功能可用性判断
Transferable contents=clipBoard.getContents(this);
if(contents==null)
{ editMenu_Paste.setEnabled(false);
popupMenu_Paste.setEnabled(false);
}
else
{ editMenu_Paste.setEnabled(true);
popupMenu_Paste.setEnabled(true);
}
}//方法checkMenuItemEnabled()结束
//关闭窗口时调用
public void exitWindowChoose()
{ editArea.requestFocus();
String currentValue=editArea.getText();
if(currentValue.equals(oldValue)==true)
{ System.exit(0);
}
else
{ int exitChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","退出提示",JOptionPane.YES_NO_CANCEL_OPTION);
if(exitChoose==JOptionPane.YES_OPTION)
{ //boolean isSave=false;
if(isNewFile)
{
String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result=fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText(" 您没有保存文件");
return;
}
File saveFileName=fileChooser.getSelectedFile();
if(saveFileName==null||saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileWriter fw=new FileWriter(saveFileName);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();
fw.close();
isNewFile=false;
currentFile=saveFileName;
oldValue=editArea.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
statusLabel.setText(" 当前打开文件:"+saveFileName.getAbsoluteFile());
//isSave=true;
}
catch(IOException ioException){
}
}
}
else
{
try
{ FileWriter fw=new FileWriter(currentFile);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();
fw.close();
//isSave=true;
}
catch(IOException ioException){
}
}
System.exit(0);
//if(isSave)System.exit(0);
//else return;
}
else if(exitChoose==JOptionPane.NO_OPTION)
{ System.exit(0);
}
else
{ return;
}
}
}//关闭窗口时调用方法结束
//查找方法
public void find()
{ final JDialog findDialog=new JDialog(this,"查找",false);//false时允许其他窗口同时处于激活状态(即无模式)
Container con=findDialog.getContentPane();//返回此对话框的contentPane对象
con.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel findContentLabel=new JLabel("查找内容(N):");
final JTextField findText=new JTextField(15);
JButton findNextButton=new JButton("查找下一个(F):");
final JCheckBox matchCheckBox=new JCheckBox("区分大小写(C)");
ButtonGroup bGroup=new ButtonGroup();
final JRadioButton upButton=new JRadioButton("向上(U)");
final JRadioButton downButton=new JRadioButton("向下(U)");
downButton.setSelected(true);
bGroup.add(upButton);
bGroup.add(downButton);
/*ButtonGroup此类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。
使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。*/
/*JRadioButton此类实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。
与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。
(创建一个 ButtonGroup 对象并用其 add 方法将 JRadioButton 对象包含在此组中。)*/
JButton cancel=new JButton("取消");
//取消按钮事件处理
cancel.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ findDialog.dispose();
}
});
//"查找下一个"按钮监听
findNextButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ //"区分大小写(C)"的JCheckBox是否被选中
int k=0,m=0;
final String str1,str2,str3,str4,strA,strB;
str1=editArea.getText();
str2=findText.getText();
str3=str1.toUpperCase();
str4=str2.toUpperCase();
if(matchCheckBox.isSelected())//区分大小写
{ strA=str1;
strB=str2;
}
else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找
{ strA=str3;
strB=str4;
}
if(upButton.isSelected())
{ //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
if(editArea.getSelectedText()==null)
k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
else
k=strA.lastIndexOf(strB, editArea.getCaretPosition()-findText.getText().length()-1);
if(k>-1)
{ //String strData=strA.subString(k,strB.getText().length()+1);
editArea.setCaretPosition(k);
editArea.select(k,k+strB.length());
}
else
{ JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);
}
}
else if(downButton.isSelected())
{ if(editArea.getSelectedText()==null)
k=strA.indexOf(strB,editArea.getCaretPosition()+1);
else
k=strA.indexOf(strB, editArea.getCaretPosition()-findText.getText().length()+1);
if(k>-1)
{ //String strData=strA.subString(k,strB.getText().length()+1);
editArea.setCaretPosition(k);
editArea.select(k,k+strB.length());
}
else
{ JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);
}
}
}
});//"查找下一个"按钮监听结束
//创建"查找"对话框的界面
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
JPanel directionPanel=new JPanel();
directionPanel.setBorder(BorderFactory.createTitledBorder("方向"));
//设置directionPanel组件的边框;
//BorderFactory.createTitledBorder(String title)创建一个新标题边框,使用默认边框(浮雕化)、默认文本位置(位于顶线上)、默认调整 (leading) 以及由当前外观确定的默认字体和文本颜色,并指定了标题文本。
directionPanel.add(upButton);
directionPanel.add(downButton);
panel1.setLayout(new GridLayout(2,1));
panel1.add(findNextButton);
panel1.add(cancel);
panel2.add(findContentLabel);
panel2.add(findText);
panel2.add(panel1);
panel3.add(matchCheckBox);
panel3.add(directionPanel);
con.add(panel2);
con.add(panel3);
findDialog.setSize(410,180);
findDialog.setResizable(false);//不可调整大小
findDialog.setLocation(230,280);
findDialog.setVisible(true);
}//查找方法结束
//替换方法
public void replace()
{ final JDialog replaceDialog=new JDialog(this,"替换",false);//false时允许其他窗口同时处于激活状态(即无模式)
Container con=replaceDialog.getContentPane();//返回此对话框的contentPane对象
con.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel findContentLabel=new JLabel("查找内容(N):");
final JTextField findText=new JTextField(15);
JButton findNextButton=new JButton("查找下一个(F):");
JLabel replaceLabel=new JLabel("替换为(P):");
final JTextField replaceText=new JTextField(15);
JButton replaceButton=new JButton("替换(R)");
JButton replaceAllButton=new JButton("全部替换(A)");
JButton cancel=new JButton("取消");
cancel.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ replaceDialog.dispose();
}
});
final JCheckBox matchCheckBox=new JCheckBox("区分大小写(C)");
ButtonGroup bGroup=new ButtonGroup();
final JRadioButton upButton=new JRadioButton("向上(U)");
final JRadioButton downButton=new JRadioButton("向下(U)");
downButton.setSelected(true);
bGroup.add(upButton);
bGroup.add(downButton);
/*ButtonGroup此类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。
使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。*/
/*JRadioButton此类实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。
与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。
(创建一个 ButtonGroup 对象并用其 add 方法将 JRadioButton 对象包含在此组中。)*/
//"查找下一个"按钮监听
findNextButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ //"区分大小写(C)"的JCheckBox是否被选中
int k=0,m=0;
final String str1,str2,str3,str4,strA,strB;
str1=editArea.getText();
str2=findText.getText();
str3=str1.toUpperCase();
str4=str2.toUpperCase();
if(matchCheckBox.isSelected())//区分大小写
{ strA=str1;
strB=str2;
}
else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找
{ strA=str3;
strB=str4;
}
if(upButton.isSelected())
{ //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
if(editArea.getSelectedText()==null)
k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
else
k=strA.lastIndexOf(strB, editArea.getCaretPosition()-findText.getText().length()-1);
if(k>-1)
{ //String strData=strA.subString(k,strB.getText().length()+1);
editArea.setCaretPosition(k);
editArea.select(k,k+strB.length());
}
else
{ JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);
}
}
else if(downButton.isSelected())
{ if(editArea.getSelectedText()==null)
k=strA.indexOf(strB,editArea.getCaretPosition()+1);
else
k=strA.indexOf(strB, editArea.getCaretPosition()-findText.getText().length()+1);
if(k>-1)
{ //String strData=strA.subString(k,strB.getText().length()+1);
editArea.setCaretPosition(k);
editArea.select(k,k+strB.length());
}
else
{ JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);
}
}
}
});//"查找下一个"按钮监听结束
//"替换"按钮监听
replaceButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ if(replaceText.getText().length()==0 && editArea.getSelectedText()!=null)
editArea.replaceSelection("");
if(replaceText.getText().length()>0 && editArea.getSelectedText()!=null)
editArea.replaceSelection(replaceText.getText());
}
});//"替换"按钮监听结束
//"全部替换"按钮监听
replaceAllButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ editArea.setCaretPosition(0); //将光标放到编辑区开头
int k=0,m=0,replaceCount=0;
if(findText.getText().length()==0)
{ JOptionPane.showMessageDialog(replaceDialog,"请填写查找内容!","提示",JOptionPane.WARNING_MESSAGE);
findText.requestFocus(true);
return;
}
while(k>-1)//当文本中有内容被选中时(k>-1被选中)进行替换,否则不进行while循环
{ //"区分大小写(C)"的JCheckBox是否被选中
//int k=0,m=0;
final String str1,str2,str3,str4,strA,strB;
str1=editArea.getText();
str2=findText.getText();
str3=str1.toUpperCase();
str4=str2.toUpperCase();
if(matchCheckBox.isSelected())//区分大小写
{ strA=str1;
strB=str2;
}
else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找
{ strA=str3;
strB=str4;
}
if(upButton.isSelected())
{ //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
if(editArea.getSelectedText()==null)
k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);
else
k=strA.lastIndexOf(strB, editArea.getCaretPosition()-findText.getText().length()-1);
if(k>-1)
{ //String strData=strA.subString(k,strB.getText().length()+1);
editArea.setCaretPosition(k);
editArea.select(k,k+strB.length());
}
else
{ if(replaceCount==0)
{ JOptionPane.showMessageDialog(replaceDialog, "找不到您查找的内容!", "记事本",JOptionPane.INFORMATION_MESSAGE);
}
else
{ JOptionPane.showMessageDialog(replaceDialog,"成功替换"+replaceCount+"个匹配内容!","替换成功",JOptionPane.INFORMATION_MESSAGE);
}
}
}
else if(downButton.isSelected())
{ if(editArea.getSelectedText()==null)
k=strA.indexOf(strB,editArea.getCaretPosition()+1);
else
k=strA.indexOf(strB, editArea.getCaretPosition()-findText.getText().length()+1);
if(k>-1)
{ //String strData=strA.subString(k,strB.getText().length()+1);
editArea.setCaretPosition(k);
editArea.select(k,k+strB.length());
}
else
{ if(replaceCount==0)
{ JOptionPane.showMessageDialog(replaceDialog, "找不到您查找的内容!", "记事本",JOptionPane.INFORMATION_MESSAGE);
}
else
{ JOptionPane.showMessageDialog(replaceDialog,"成功替换"+replaceCount+"个匹配内容!","替换成功",JOptionPane.INFORMATION_MESSAGE);
}
}
}
if(replaceText.getText().length()==0 && editArea.getSelectedText()!= null)
{ editArea.replaceSelection("");
replaceCount++;
}
if(replaceText.getText().length()>0 && editArea.getSelectedText()!= null)
{ editArea.replaceSelection(replaceText.getText());
replaceCount++;
}
}//while循环结束
}
});//"替换全部"方法结束
//创建"替换"对话框的界面
JPanel directionPanel=new JPanel();
directionPanel.setBorder(BorderFactory.createTitledBorder("方向"));
//设置directionPanel组件的边框;
//BorderFactory.createTitledBorder(String title)创建一个新标题边框,使用默认边框(浮雕化)、默认文本位置(位于顶线上)、默认调整 (leading) 以及由当前外观确定的默认字体和文本颜色,并指定了标题文本。
directionPanel.add(upButton);
directionPanel.add(downButton);
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
JPanel panel4=new JPanel();
panel4.setLayout(new GridLayout(2,1));
panel1.add(findContentLabel);
panel1.add(findText);
panel1.add(findNextButton);
panel4.add(replaceButton);
panel4.add(replaceAllButton);
panel2.add(replaceLabel);
panel2.add(replaceText);
panel2.add(panel4);
panel3.add(matchCheckBox);
panel3.add(directionPanel);
panel3.add(cancel);
con.add(panel1);
con.add(panel2);
con.add(panel3);
replaceDialog.setSize(420,220);
replaceDialog.setResizable(false);//不可调整大小
replaceDialog.setLocation(230,280);
replaceDialog.setVisible(true);
}//"全部替换"按钮监听结束
//"字体"方法
public void font()
{ final JDialog fontDialog=new JDialog(this,"字体设置",false);
Container con=fontDialog.getContentPane();
con.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel fontLabel=new JLabel("字体(F):");
fontLabel.setPreferredSize(new Dimension(100,20));//构造一个Dimension,并将其初始化为指定宽度和高度
JLabel styleLabel=new JLabel("字形(Y):");
styleLabel.setPreferredSize(new Dimension(100,20));
JLabel sizeLabel=new JLabel("大小(S):");
sizeLabel.setPreferredSize(new Dimension(100,20));
final JLabel sample=new JLabel("张选仲的记事本-ZXZ's Notepad");
//sample.setHorizontalAlignment(SwingConstants.CENTER);
final JTextField fontText=new JTextField(9);
fontText.setPreferredSize(new Dimension(200,20));
final JTextField styleText=new JTextField(8);
styleText.setPreferredSize(new Dimension(200,20));
final int style[]={Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};
final JTextField sizeText=new JTextField(5);
sizeText.setPreferredSize(new Dimension(200,20));
JButton okButton=new JButton("确定");
JButton cancel=new JButton("取消");
cancel.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ fontDialog.dispose();
}
});
Font currentFont=editArea.getFont();
fontText.setText(currentFont.getFontName());
fontText.selectAll();
//styleText.setText(currentFont.getStyle());
//styleText.selectAll();
if(currentFont.getStyle()==Font.PLAIN)
styleText.setText("常规");
else if(currentFont.getStyle()==Font.BOLD)
styleText.setText("粗体");
else if(currentFont.getStyle()==Font.ITALIC)
styleText.setText("斜体");
else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
styleText.setText("粗斜体");
styleText.selectAll();
String str=String.valueOf(currentFont.getSize());
sizeText.setText(str);
sizeText.selectAll();
final JList fontList,styleList,sizeList;
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
final String fontName[]=ge.getAvailableFontFamilyNames();
fontList=new JList(fontName);
fontList.setFixedCellWidth(86);
fontList.setFixedCellHeight(20);
fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final String fontStyle[]={"常规","粗体","斜体","粗斜体"};
styleList=new JList(fontStyle);
styleList.setFixedCellWidth(86);
styleList.setFixedCellHeight(20);
styleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if(currentFont.getStyle()==Font.PLAIN)
styleList.setSelectedIndex(0);
else if(currentFont.getStyle()==Font.BOLD)
styleList.setSelectedIndex(1);
else if(currentFont.getStyle()==Font.ITALIC)
styleList.setSelectedIndex(2);
else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))
styleList.setSelectedIndex(3);
final String fontSize[]={"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};
sizeList=new JList(fontSize);
sizeList.setFixedCellWidth(43);
sizeList.setFixedCellHeight(20);
sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fontList.addListSelectionListener(new ListSelectionListener()
{ public void valueChanged(ListSelectionEvent event)
{ fontText.setText(fontName[fontList.getSelectedIndex()]);
fontText.selectAll();
Font sampleFont1=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
sample.setFont(sampleFont1);
}
});
styleList.addListSelectionListener(new ListSelectionListener()
{ public void valueChanged(ListSelectionEvent event)
{ int s=style[styleList.getSelectedIndex()];
styleText.setText(fontStyle[s]);
styleText.selectAll();
Font sampleFont2=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
sample.setFont(sampleFont2);
}
});
sizeList.addListSelectionListener(new ListSelectionListener()
{ public void valueChanged(ListSelectionEvent event)
{ sizeText.setText(fontSize[sizeList.getSelectedIndex()]);
//sizeText.requestFocus();
sizeText.selectAll();
Font sampleFont3=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
sample.setFont(sampleFont3);
}
});
okButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ Font okFont=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));
editArea.setFont(okFont);
fontDialog.dispose();
}
});
JPanel samplePanel=new JPanel();
samplePanel.setBorder(BorderFactory.createTitledBorder("示例"));
//samplePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
samplePanel.add(sample);
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
//JPanel panel4=new JPanel();
//JPanel panel5=new JPanel();
//panel1.add(fontLabel);
//panel1.add(styleLabel);
//panel1.add(sizeLabel);
//panel2.add(fontText);
//panel2.add(new JScrollPane(fontList));//JList不支持直接滚动,所以要让JList作为JScrollPane的视口视图
//panel2.setLayout(new GridLayout(2,1));
//panel3.add(styleText);
//panel3.add(new JScrollPane(styleList));
//panel3.setLayout(new GridLayout(2,1));
//panel4.add(sizeText);
//panel4.add(new JScrollPane(sizeText));
//panel4.setLayout(new GridLayout(2,1));
//panel5.add(okButton);
//panel5.add(cancel);
//con.add(panel1);
//con.add(panel2);
//con.add(panel3);
//con.add(panel4);
//con.add(panel5);
panel2.add(fontText);
panel2.add(styleText);
panel2.add(sizeText);
panel2.add(okButton);
panel3.add(new JScrollPane(fontList));//JList不支持直接滚动,所以要让JList作为JScrollPane的视口视图
panel3.add(new JScrollPane(styleList));
panel3.add(new JScrollPane(sizeList));
panel3.add(cancel);
con.add(panel1);
con.add(panel2);
con.add(panel3);
con.add(samplePanel);
fontDialog.setSize(350,340);
fontDialog.setLocation(200,200);
fontDialog.setResizable(false);
fontDialog.setVisible(true);
}
//public void menuPerformed(MenuEvent e)
//{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
//}
public void actionPerformed(ActionEvent e)
{ //新建
if(e.getSource()==fileMenu_New)
{ editArea.requestFocus();
String currentValue=editArea.getText();
boolean isTextChange=(currentValue.equals(oldValue))?false:true;
if(isTextChange)
{ int saveChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION);
if(saveChoose==JOptionPane.YES_OPTION)
{ String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result=fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText("您没有选择任何文件");
return;
}
File saveFileName=fileChooser.getSelectedFile();
if(saveFileName==null || saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileWriter fw=new FileWriter(saveFileName);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();//刷新该流的缓冲
bfw.close();
isNewFile=false;
currentFile=saveFileName;
oldValue=editArea.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
statusLabel.setText("当前打开文件:"+saveFileName.getAbsoluteFile());
}
catch (IOException ioException)
{
}
}
}
else if(saveChoose==JOptionPane.NO_OPTION)
{ editArea.replaceRange("",0,editArea.getText().length());
statusLabel.setText(" 新建文件");
this.setTitle("无标题 - 记事本");
isNewFile=true;
undo.discardAllEdits(); //撤消所有的"撤消"操作
editMenu_Undo.setEnabled(false);
oldValue=editArea.getText();
}
else if(saveChoose==JOptionPane.CANCEL_OPTION)
{ return;
}
}
else
{ editArea.replaceRange("",0,editArea.getText().length());
statusLabel.setText(" 新建文件");
this.setTitle("无标题 - 记事本");
isNewFile=true;
undo.discardAllEdits();//撤消所有的"撤消"操作
editMenu_Undo.setEnabled(false);
oldValue=editArea.getText();
}
}//新建结束
//打开
else if(e.getSource()==fileMenu_Open)
{ editArea.requestFocus();
String currentValue=editArea.getText();
boolean isTextChange=(currentValue.equals(oldValue))?false:true;
if(isTextChange)
{ int saveChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION);
if(saveChoose==JOptionPane.YES_OPTION)
{ String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result=fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText("您没有选择任何文件");
return;
}
File saveFileName=fileChooser.getSelectedFile();
if(saveFileName==null || saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileWriter fw=new FileWriter(saveFileName);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();//刷新该流的缓冲
bfw.close();
isNewFile=false;
currentFile=saveFileName;
oldValue=editArea.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
statusLabel.setText("当前打开文件:"+saveFileName.getAbsoluteFile());
}
catch (IOException ioException)
{
}
}
}
else if(saveChoose==JOptionPane.NO_OPTION)
{ String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("打开文件");
int result=fileChooser.showOpenDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText("您没有选择任何文件");
return;
}
File fileName=fileChooser.getSelectedFile();
if(fileName==null || fileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileReader fr=new FileReader(fileName);
BufferedReader bfr=new BufferedReader(fr);
editArea.setText("");
while((str=bfr.readLine())!=null)
{ editArea.append(str);
}
this.setTitle(fileName.getName()+" - 记事本");
statusLabel.setText(" 当前打开文件:"+fileName.getAbsoluteFile());
fr.close();
isNewFile=false;
currentFile=fileName;
oldValue=editArea.getText();
}
catch (IOException ioException)
{
}
}
}
else
{ return;
}
}
else
{ String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("打开文件");
int result=fileChooser.showOpenDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText(" 您没有选择任何文件 ");
return;
}
File fileName=fileChooser.getSelectedFile();
if(fileName==null || fileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileReader fr=new FileReader(fileName);
BufferedReader bfr=new BufferedReader(fr);
editArea.setText("");
while((str=bfr.readLine())!=null)
{ editArea.append(str);
}
this.setTitle(fileName.getName()+" - 记事本");
statusLabel.setText(" 当前打开文件:"+fileName.getAbsoluteFile());
fr.close();
isNewFile=false;
currentFile=fileName;
oldValue=editArea.getText();
}
catch (IOException ioException)
{
}
}
}
}//打开结束
//保存
else if(e.getSource()==fileMenu_Save)
{ editArea.requestFocus();
if(isNewFile)
{ String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("保存");
int result=fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText("您没有选择任何文件");
return;
}
File saveFileName=fileChooser.getSelectedFile();
if(saveFileName==null || saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileWriter fw=new FileWriter(saveFileName);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();//刷新该流的缓冲
bfw.close();
isNewFile=false;
currentFile=saveFileName;
oldValue=editArea.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
statusLabel.setText("当前打开文件:"+saveFileName.getAbsoluteFile());
}
catch (IOException ioException)
{
}
}
}
else
{ try
{ FileWriter fw=new FileWriter(currentFile);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();
fw.close();
}
catch(IOException ioException)
{
}
}
}//保存结束
//另存为
else if(e.getSource()==fileMenu_SaveAs)
{ editArea.requestFocus();
String str=null;
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//fileChooser.setApproveButtonText("确定");
fileChooser.setDialogTitle("另存为");
int result=fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
{ statusLabel.setText(" 您没有选择任何文件");
return;
}
File saveFileName=fileChooser.getSelectedFile();
if(saveFileName==null||saveFileName.getName().equals(""))
{ JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);
}
else
{ try
{ FileWriter fw=new FileWriter(saveFileName);
BufferedWriter bfw=new BufferedWriter(fw);
bfw.write(editArea.getText(),0,editArea.getText().length());
bfw.flush();
fw.close();
oldValue=editArea.getText();
this.setTitle(saveFileName.getName()+" - 记事本");
statusLabel.setText(" 当前打开文件:"+saveFileName.getAbsoluteFile());
}
catch(IOException ioException)
{
}
}
}//另存为结束
//页面设置
else if(e.getSource()==fileMenu_PageSetUp)
{ editArea.requestFocus();
JOptionPane.showMessageDialog(this,"对不起,此功能尚未实现!更多请看http://pan.muyi.so","提示",JOptionPane.WARNING_MESSAGE);
}//页面设置结束
//打印
else if(e.getSource()==fileMenu_Print)
{ editArea.requestFocus();
JOptionPane.showMessageDialog(this,"对不起,此功能尚未实现!更多请看http://pan.muyi.so","提示",JOptionPane.WARNING_MESSAGE);
}//打印结束
//退出
else if(e.getSource()==fileMenu_Exit)
{ int exitChoose=JOptionPane.showConfirmDialog(this,"确定要退出吗?","退出提示",JOptionPane.OK_CANCEL_OPTION);
if(exitChoose==JOptionPane.OK_OPTION)
{ System.exit(0);
}
else
{ return;
}
}//退出结束
//编辑
//else if(e.getSource()==editMenu)
//{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
//}
//编辑结束
//撤销
else if(e.getSource()==editMenu_Undo || e.getSource()==popupMenu_Undo)
{ editArea.requestFocus();
if(undo.canUndo())
{ try
{ undo.undo();
}
catch (CannotUndoException ex)
{ System.out.println("Unable to undo:" + ex);
//ex.printStackTrace();
}
}
if(!undo.canUndo())
{ editMenu_Undo.setEnabled(false);
}
}//撤销结束
//剪切
else if(e.getSource()==editMenu_Cut || e.getSource()==popupMenu_Cut)
{ editArea.requestFocus();
String text=editArea.getSelectedText();
StringSelection selection=new StringSelection(text);
clipBoard.setContents(selection,null);
editArea.replaceRange("",editArea.getSelectionStart(),editArea.getSelectionEnd());
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除功能的可用性
}//剪切结束
//复制
else if(e.getSource()==editMenu_Copy || e.getSource()==popupMenu_Copy)
{ editArea.requestFocus();
String text=editArea.getSelectedText();
StringSelection selection=new StringSelection(text);
clipBoard.setContents(selection,null);
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除功能的可用性
}//复制结束
//粘帖
else if(e.getSource()==editMenu_Paste || e.getSource()==popupMenu_Paste)
{ editArea.requestFocus();
Transferable contents=clipBoard.getContents(this);
if(contents==null)return;
String text="";
try
{ text=(String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (Exception exception)
{
}
editArea.replaceRange(text,editArea.getSelectionStart(),editArea.getSelectionEnd());
checkMenuItemEnabled();
}//粘帖结束
//删除
else if(e.getSource()==editMenu_Delete || e.getSource()==popupMenu_Delete)
{ editArea.requestFocus();
editArea.replaceRange("",editArea.getSelectionStart(),editArea.getSelectionEnd());
checkMenuItemEnabled(); //设置剪切、复制、粘贴、删除等功能的可用性
}//删除结束
//查找
else if(e.getSource()==editMenu_Find)
{ editArea.requestFocus();
find();
}//查找结束
//查找下一个
else if(e.getSource()==editMenu_FindNext)
{ editArea.requestFocus();
find();
}//查找下一个结束
//替换
else if(e.getSource()==editMenu_Replace)
{ editArea.requestFocus();
replace();
}//替换结束
//转到
else if(e.getSource()==editMenu_GoTo)
{ editArea.requestFocus();
JOptionPane.showMessageDialog(this,"对不起,此功能尚未实现!更多请看http://pan.muyi.so","提示",JOptionPane.WARNING_MESSAGE);
}//转到结束
//时间日期
else if(e.getSource()==editMenu_TimeDate)
{ editArea.requestFocus();
//SimpleDateFormat currentDateTime=new SimpleDateFormat("HH:mmyyyy-MM-dd");
//editArea.insert(currentDateTime.format(new Date()),editArea.getCaretPosition());
Calendar rightNow=Calendar.getInstance();
Date date=rightNow.getTime();
editArea.insert(date.toString(),editArea.getCaretPosition());
}//时间日期结束
//全选
else if(e.getSource()==editMenu_SelectAll || e.getSource()==popupMenu_SelectAll)
{ editArea.selectAll();
}//全选结束
//自动换行(已在前面设置)
else if(e.getSource()==formatMenu_LineWrap)
{ if(formatMenu_LineWrap.getState())
editArea.setLineWrap(true);
else
editArea.setLineWrap(false);
}//自动换行结束
//字体设置
else if(e.getSource()==formatMenu_Font)
{ editArea.requestFocus();
font();
}//字体设置结束
//设置状态栏可见性
else if(e.getSource()==viewMenu_Status)
{ if(viewMenu_Status.getState())
statusLabel.setVisible(true);
else
statusLabel.setVisible(false);
}//设置状态栏可见性结束
//帮助主题
else if(e.getSource()==helpMenu_HelpTopics)
{ editArea.requestFocus();
JOptionPane.showMessageDialog(this,"路漫漫其修远兮,吾将上下而求索。","帮助主题",JOptionPane.INFORMATION_MESSAGE);
}//帮助主题结束
//关于
else if(e.getSource()==helpMenu_AboutNotepad)
{ editArea.requestFocus();
JOptionPane.showMessageDialog(this,
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n"+
" 编写者:沐伊科技 \n"+
" 编写时间:2016-06-09 \n"+
" 更多教程:http://pan.muyi.so (网盘资源教程应有尽有哦!) \n"+
" e-mail:llqqxf@163.com \n"+
" 一些地方借鉴他人,不足之处希望大家能提出意见,谢谢! \n"+
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n",
"记事本",JOptionPane.INFORMATION_MESSAGE);
}//关于结束
}//方法actionPerformed()结束
//实现DocumentListener接口中的方法(与撤销操作有关)
public void removeUpdate(DocumentEvent e)
{ editMenu_Undo.setEnabled(true);
}
public void insertUpdate(DocumentEvent e)
{ editMenu_Undo.setEnabled(true);
}
public void changedUpdate(DocumentEvent e)
{ editMenu_Undo.setEnabled(true);
}//DocumentListener结束
//实现接口UndoableEditListener的类UndoHandler(与撤销操作有关)
class UndoHandler implements UndoableEditListener
{ public void undoableEditHappened(UndoableEditEvent uee)
{ undo.addEdit(uee.getEdit());
}
}
//main函数开始
public static void main(String args[])
{ Notepad notepad=new Notepad();
notepad.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用 System exit 方法退出应用程序
}//main函数结束
}
本次做这个记事本小程序,主要是为了学习Swing包中几个重要的类JFileChooser,JOptionPane,JMenu,当然也顺便巩固一下前面学的IO 流的知识。
一、简要介绍
1、JFileChooser
JFileChooser为用户选择文件提供了一种简单机制,可弹出针对用户主目录的文件选择器。编写记事本程序主要用到了以下几种方法:
a. showOpenDialog(Component parent) :弹出一个 "Open File" 文件选择器对话框,该文件选择器被弹下时返回一个int型数据,包括以下几种状态:
JFileChooser.CANCEL_OPTION 取消
JFileChooser.APPROVE_OPTION 确认
JFileChooser.ERROR_OPTION 如果发生错误或者该对话框已被解除
b. showSaveDialog(Component parent) : 弹出一个 "Save File" 文件选择器对话框,该文件选择器被弹下时返回一个int型数据,状态同上;
c. getSelectedFile() 返回选中的文件,返回值为File类型;
d. getName(File f) 返回文件名,返回值为String类型
2、JOptionPane
1.1、用途:JOptionPane主要用来弹出要求用户提供值或向其发出通知的标准对话框。
1.2、特点:所有对话框都是有模式的,在用户交互完成之前,每个 showXxxDialog 方法都一直阻塞调用者。
1.3、基本类型:
showConfirmDialog(): 确认对话框
showInputDialog(): 输入对话框
showMessageDialog():消息提示框
showOptionDialog(): 选择对话框
JOptionPane类方法众多,但基本上用起来都是对上述四种方法的单行调用。
1.4、参数介绍:
以下述方法为例:
<a href="https://blog.csdn.net/LIAO_7053/javax/swing/JOptionPane.html#showOptionDialog%28java.awt.Component,%20java.lang.Object,%20java.lang.String,%20int,%20int,%20javax.swing.Icon,%20java.lang.Object%5B%5D,%20java.lang.Object%29">showOptionDialog</a>(<a href="https://blog.csdn.net/LIAO_7053/java/awt/Component.html">Component</a> parentComponent, <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a> message, <a href="https://blog.csdn.net/LIAO_7053/java/lang/String.html">String</a> title, int optionType, int messageType, <a href="https://blog.csdn.net/LIAO_7053/javax/swing/Icon.html">Icon</a> icon, <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>[] options, <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a> initialValue)
参数描述类型parentComponent对话框所在容器 <a href="https://blog.csdn.net/LIAO_7053/java/awt/Component.html">Component</a>
message消息 <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>
title对话框标题 <a href="https://blog.csdn.net/LIAO_7053/java/lang/String.html">String</a>
optionType选择按钮类型
int:
DEFAULT_OPTION YES_NO_OPTION
YES_NO_CANCEL_OPTION OK_CANCEL_OPTION
messageType消息类型
int:
ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE
QUESTION_MESSAGE PLAIN_MESSAGE
icon自定义消息图标 <a href="https://blog.csdn.net/LIAO_7053/javax/swing/Icon.html">Icon</a>
options操作选项<a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>[]
initialValue默认选择<a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>
有关JOptionPane的具体用法可参考源代码或者下面这篇博客:
https://blog.csdn.net/tjk123456/article/details/77868034
3、JMenu
3.1、菜单分为下拉式菜单和弹出式菜单(JPopupMenu),其中下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)、JMenuItem(菜单项)。
3.2、JMenuBar:
a. JMenuBar表示一个水平的菜单栏,用来管理菜单,不参与用户交互操作;
b. 可通过调用setJMenuBar( )方法将JMenuBar设置在顶级窗口的顶部;
c. 可通过调用add( JMenu menu)方法添加菜单。
3.3、 JMenu
a. JMenu 表示一个菜单,用来整理菜单项;
b. 通过调用add( )方法可向菜单里面添加菜单项或者菜单、按钮等;
c. 通过调用addSeparator( )方法可向菜单栏里面添加分隔符。
3.4、 JMenuItem
a. JMenuIten表示菜单项,是菜单系统中最基本的组件;
b. JMenuIten继承AbstractButton类,因此可以把它看作一个按钮。
二、记事本功能实现
1、实现了记事本的文件打开和保存功能(主要功能);
2、更换了标题栏默认的java图标,改成记事本图标;
3、重写了窗体关闭事件方法,点击关闭按钮时,先做文件是否保存判断,若文件已保存则直接退出程序,否则弹出是否保存文件对话框;
4、记事本输入框采用滚动条加文本框设计;
5、文中多次运用JOptionPane和JFileChooser对话框,尽量做到与windows运行机制一样,包含大量操作提示信息;
6、实现了文件读取、写入、命名、路径选择等功能;
三、代码实现
package com.liao.notepad0822;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class MainUI extends JFrame {
private static final long serialVersionUID = -8533346717300013642L;
private JTextArea jta;
private JScrollPane jsp;
private static String name;
private JFileChooser jfc = new JFileChooser();
public static void main(String[] args) {
new MainUI().init();
}
// 初始化界面
public void init() {
setSize(800, 600);
setLocationRelativeTo(null);
// 设置关闭按钮动作不执行任何操作
setDefaultCloseOperation(0);
name = "新建文本文档.txt";
// 设置标志图案
ImageIcon ii = new ImageIcon("file\\1.png");
setIconImage(ii.getImage());
// 设置文件名
setTitle(name + " - 记事本");
// 添加菜单栏
addMenu();
// 添加文本框
jta = new JTextArea();
// 添加滚动条
jsp = new JScrollPane(jta);
jsp.setPreferredSize(new Dimension(780, 550));
add(jsp, BorderLayout.CENTER);
setVisible(true);// 设置窗口可见
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (showSaveDialog() != JOptionPane.CANCEL_OPTION)// 若不是取消按钮,关闭程序
setDefaultCloseOperation(3);
}
});
}
// 添加菜单栏
private void addMenu() {
// 添加菜单栏
JMenuBar jmb = new JMenuBar();
// 设置菜单栏位置在顶级窗口的顶部
setJMenuBar(jmb);
// 菜单栏菜单
JMenu jm_file = new JMenu("文件");
JMenu jm_edit = new JMenu("编辑");
jmb.add(jm_file);
jmb.add(jm_edit);
// 给文件菜单添加菜单项
JMenuItem item1 = new JMenuItem("打开");
JMenuItem item2 = new JMenuItem("保存");
jm_file.add(item1);
jm_file.add(item2);
// "打开"菜单项添加动作监听器
item1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 是否保存对原文件修改
if (showSaveDialog() == JOptionPane.CANCEL_OPTION) {// 取消按钮,则返回
return;
}
// 弹出一个 "Open File" 文件选择器对话框
int select = jfc.showOpenDialog(MainUI.this);
// 选择打开文件,则读写文件
if (select == JFileChooser.APPROVE_OPTION) {
jta.setText(readFile());// 写入文本框
jta.setCaretPosition(0);// 定位光标至行首
}
}
});
// “保存”菜单项添加动作监听器
item2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jfc.getSelectedFile() == null) {
createFile();//调用创建文件方法
} else {
showSaveDialog();//调用文件是否保存方法
}
}
});
}
// 读取文件
private String readFile() {
// 声明缓冲字符流变量
BufferedReader br = null;
StringBuilder sb = null;
try {
br = new BufferedReader(new FileReader(jfc.getSelectedFile()));
sb = new StringBuilder();// 创建缓冲字符串
String str;
int count = 0;//控制添加换行符,与原文保持一致
while ((str = br.readLine()) != null) {
if (count == 0)
sb.append(str);
if (count++ != 0)
sb.append("\n" + str);// 添加换行
}
} catch (FileNotFoundException e1) {
// 弹出“文件未找到”对话框,返回null
JOptionPane.showMessageDialog(null, "未找到该文件!");
return null;
} catch (IOException e1) {
// 弹出“文件读取异常”对话框,返回null
JOptionPane.showMessageDialog(null, "文件读取异常");
return null;
} finally {
// 关闭字符流
if (br != null)
try {
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
name = jfc.getSelectedFile().getName();
setTitle(name + " - 记事本");//设置文件名
return sb.toString();
}
// 保存对话框
private int showSaveDialog() {
int select = 0;
// 判断文本框是否为空
if (!jta.getText().equals("")) {
// 判断文件是否为空
if (jfc.getSelectedFile() == null) {
select = JOptionPane.showConfirmDialog(MainUI.this, "是否保存修改?");
if (select == JOptionPane.YES_OPTION) {
createFile();//文件不存在,则创建文件
}
} else {
if (!isSaved()) {// 文件未保存
select = JOptionPane.showConfirmDialog(MainUI.this, "是否保存修改?");
if (select == JOptionPane.YES_OPTION) {
saveFile(jfc.getSelectedFile());
}
}
}
}
return select;// 返回选项
}
// 创建新文件
private void createFile() {
// String name = null;
File file = null;
// 选择保存或取消
if (jfc.showSaveDialog(MainUI.this) == JFileChooser.APPROVE_OPTION) {
file = jfc.getSelectedFile();// 获取选中的文件
} else {
return;
}
name = jfc.getName(file);// 获取输入的文件名
if (file.exists()) { // 若选择已有文件----询问是否要覆盖
int i = JOptionPane.showConfirmDialog(null, "该文件已存在,是否覆盖原文件", "确认", JOptionPane.YES_NO_OPTION);
if (i == JOptionPane.YES_OPTION) {
saveFile(file);
} else {
jfc.showSaveDialog(MainUI.this);// 重新选择
}
} else {//文件不存在,则直接保存
saveFile(file);
}
}
// 判断文件是否保存
private Boolean isSaved() {
// 比较内容
if (jta.getText().equals(readFile())) {
return true;
}
return false;
}
// 保存文件,文件不存在则创建新文件
private void saveFile(File file) {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
bw.write(jta.getText());//写入文件
bw.flush();
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(MainUI.this, "文件保存出错" + e1.getMessage());
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
if (bw != null)
bw.close();
} catch (IOException e1) {
}
}
}
}
四、小结
此次编写记事本程序,基本完成了预期目标,熟悉了解了菜单栏、标题栏、对话框、JFileChooser,JOptionPane以及IO流的相关知识。不过花费的时间略微超过了预期,主要是记事本这个程序看着简单,但实际上对逻辑上的要求比较高。主体功能实现后,后期的一些细节处理往往需要大量的时间去测试、整理及优化。
这里有个小细节需要注意一下,使用reaLline()读取数据时,要特别注意换行符的使用,保持跟原文结构一样。
好了,由于本次写记事本主要是为了熟悉Swing里面的几个类,所以记事本其它的一些功能并未去实现,各位有兴趣的话可以自己去尝试!