java写的记事本

该博客展示了用Java编写的记事本程序代码。包含多个import语句引入必要的类库,定义了Mynote类继承JFrame,实现了新建、打开、保存、打印等功能,还处理了文本编辑、字体设置、查找等操作,以及窗口关闭时的保存提示。

其实JAVA自带的例子就也有用JAVA写的记事本,在demo/jfc目录下。
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
import java.awt.Font;
import java.awt.print.*;
import javax.swing.text.*;
import java.awt.datatransfer.*;
public class Mynote extends JFrame
{
public boolean changed; //控制文本域内文字是否改变情况。
public JTextArea jta=new JTextArea("", 60,60);
public JScrollPane jsp=new JScrollPane(jta);
public JMenuBar jmb;
public JMenu jm,editjm,setjm,viewjm,helpjm;
public JMenuItem newjmi,openjmi,savejmi,saveasjmi,printjmi,exitjmi;
public JSeparator js1=new JSeparator();
public JSeparator js2=new JSeparator();
public ActionListener al=new A();
public String fileName=""; //定义保存的文件名
public JMenuItem copyjmi,pastejmi,cutjmi,findjmi,findnjmi,deletejmi,selectalljmi,undojmi;
public JMenuItem fontjmi,fjmi,bjmi; //font设置字体样式
public JMenuItem toolsjmi;
public JMenuItem aboutjmi;
public JSeparator js3=new JSeparator();
public JSeparator js4=new JSeparator();
public JToolBar jtb;
public String quick[]=new String[]{"new","open","save","saveas","delete","copy","paste","cut","selectall"};

PrinterJob prtMe = PrinterJob.getPrinterJob();
public Mynote()
{
this.setTitle("我的记事本");
this.setSize(new Dimension(400,400));
jta.getDocument().addDocumentListener(new DocumentListener()
{
public void insertUpdate(DocumentEvent e)
{
changed=true;
}
public void removeUpdate(DocumentEvent e)
{
changed=true;
}
public void changedUpdate(DocumentEvent e)
{
changed=true;
}
}
);
jta.setBackground(Color.white);
jta.setForeground(Color.black);
jta.setFont(new Font("",Font.BOLD,12));
jsp.setViewportView(jta);
this.getContentPane().add(jsp,BorderLayout.CENTER);
this.Compose();
this.setJMenuBar(jmb);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(changed==true)
{
int n;
Object[] option={"是","否"};
n=JOptionPane.showOptionDialog(null,
"你的文件还没有保存,请保存后关闭!",
"请保存",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
option,
option[0]);
switch(n)
{
case JOptionPane.YES_OPTION:
doSave(fileName);
break;
case JOptionPane.NO_OPTION:
break;
default: break;
}
}
System.exit(0);
}
});
}
public void Compose()
  {
//文件菜单布局newjmi,openjmi,savejmi,saveasjmi,printjmi,exitjmi
jmb=new JMenuBar();
jm=new JMenu();
editjm=new JMenu();
newjmi=new JMenuItem();
openjmi=new JMenuItem();
savejmi=new JMenuItem();
saveasjmi=new JMenuItem();
printjmi=new JMenuItem();
exitjmi=new JMenuItem();
js1=new JSeparator();
js2=new JSeparator();
jm.setMnemonic(KeyEvent.VK_F);//定义快捷键
jm.setText("文件");
newjmi.setMnemonic(KeyEvent.VK_N);
newjmi.setText("新建");
newjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
newjmi.addActionListener(al);
jm.add(newjmi);
jm.add(js1);//or:jm.addSeparator();
openjmi.setMnemonic(KeyEvent.VK_O);
openjmi.setText("打开");
openjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
openjmi.addActionListener(al);
jm.add(openjmi);
savejmi.setMnemonic(KeyEvent.VK_S);
savejmi.setText("保存");
savejmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
savejmi.addActionListener(al);
jm.add(savejmi);
saveasjmi.setMnemonic(KeyEvent.VK_A);
saveasjmi.setText("另存为");
saveasjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
saveasjmi.addActionListener(al);
jm.add(saveasjmi);
printjmi.setMnemonic(KeyEvent.VK_A);
printjmi.setText("打印");
printjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
printjmi.addActionListener(al);
jm.add(printjmi);
jm.add(js2);
exitjmi.setMnemonic(KeyEvent.VK_X);
exitjmi.setText("退出");
exitjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
exitjmi.addActionListener(al);
jm.add(exitjmi);
//文件菜单设置结束。copyjmi,pastejmi,cutjmi,findjmi,findnjmi,deletejmi,selectalljmi,undojmi;
editjm.setText("编辑");
editjm.setMnemonic(KeyEvent.VK_E);
copyjmi=new JMenuItem();
pastejmi=new JMenuItem();
cutjmi=new JMenuItem();
findjmi=new JMenuItem();
findnjmi=new JMenuItem();
deletejmi=new JMenuItem();
selectalljmi=new JMenuItem();
undojmi=new JMenuItem();
copyjmi.setText("复制");
copyjmi.setMnemonic(KeyEvent.VK_C);
copyjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
copyjmi.addActionListener(al);
editjm.add(copyjmi);
pastejmi.setText("粘贴");
pastejmi.setMnemonic(KeyEvent.VK_P);
pastejmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
pastejmi.addActionListener(al);
editjm.add(pastejmi);
cutjmi.setText("剪切");
cutjmi.setMnemonic(KeyEvent.VK_X);
cutjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
cutjmi.addActionListener(al);
editjm.add(cutjmi);
editjm.add(js3);
findjmi.setText("查找");
findjmi.setMnemonic(KeyEvent.VK_F);
findjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));
findjmi.addActionListener(al);
findnjmi.setText("查找下一个");
findnjmi.addActionListener(al);
editjm.add(findjmi);
editjm.add(findnjmi);
editjm.addSeparator();
deletejmi.setText(" 删除");
deletejmi.setMnemonic(KeyEvent.VK_D);
deletejmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,InputEvent.CTRL_MASK));
deletejmi.addActionListener(new delete());
selectalljmi.setText("全选");
selectalljmi.setMnemonic(KeyEvent.VK_S);
selectalljmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
selectalljmi.addActionListener(new selectAllL());
undojmi.setText("撤消");
undojmi.setMnemonic(KeyEvent.VK_U);
undojmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));
undojmi.addActionListener(al);
editjm.add(deletejmi);
editjm.add(selectalljmi);
editjm.add(undojmi);//编辑菜单设置结束
setjm=new JMenu();
setjm.setText("设置");
setjm.setMnemonic(KeyEvent.VK_S);
fjmi=new JMenuItem();
fjmi.setText("字体颜色...");
fjmi.setMnemonic(KeyEvent.VK_F);
fjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,InputEvent.CTRL_MASK));
fjmi.addActionListener(al);
fontjmi=new JMenuItem();
fontjmi.setText("字体样式...");
fontjmi.setMnemonic(KeyEvent.VK_I);
fontjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,InputEvent.CTRL_MASK));
fontjmi.addActionListener(al);
bjmi=new JMenuItem();
bjmi.setText("背景颜色...");
bjmi.setMnemonic(KeyEvent.VK_B);
bjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,InputEvent.CTRL_MASK));
bjmi.addActionListener(al);
setjm.add(fjmi);
setjm.add(fontjmi);
setjm.add(bjmi);
viewjm=new JMenu();
viewjm.setText("视图");
viewjm.setMnemonic(KeyEvent.VK_W);
toolsjmi=new JMenuItem();
toolsjmi.setText("工具栏");
toolsjmi.setMnemonic(KeyEvent.VK_T);
toolsjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));
toolsjmi.addActionListener(al);
viewjm.add(toolsjmi);
helpjm=new JMenu();
helpjm.setText("帮助");
helpjm.setMnemonic(KeyEvent.VK_H);
aboutjmi=new JMenuItem();
aboutjmi.setText("关于");
aboutjmi.setMnemonic(KeyEvent.VK_A);
aboutjmi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
aboutjmi.addActionListener(al);
helpjm.add(aboutjmi);
jmb.add(jm);
jmb.add(editjm);
jmb.add(setjm);
jmb.add(viewjm);
jmb.add(helpjm);
jtb=new JToolBar();
jtb.setFloatable(false);
addButtons();
this.getContentPane().add(jtb,BorderLayout.PAGE_START);
definePopupMenu();
}
public void definePopupMenu()
{
JPopupMenu popupjm=new JPopupMenu();
MouseListener ml=new popuplistener(popupjm);
JMenuItem jmi=null;
jmi=new JMenuItem("新建");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
newactionlistener();
}
});
popupjm.add(jmi);
popupjm.addSeparator();
jmi=new JMenuItem("打开");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
openactionlistener();
}
});
popupjm.add(jmi);
jmi=new JMenuItem("保存");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
doSave(fileName);
}
});
popupjm.add(jmi);
jmi=new JMenuItem("另保存");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
doSaveAs();
}
});
popupjm.add(jmi);
popupjm.addSeparator();
jmi=new JMenuItem("查找");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
new Finder(Mynote.this,jta).show();
}
});
popupjm.add(jmi);
popupjm.addSeparator();
jmi=new JMenuItem("复制");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jta.copy();
}
});
popupjm.add(jmi);
jmi=new JMenuItem("粘贴");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jta.paste();
}
});
popupjm.add(jmi);
jmi=new JMenuItem("剪切");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jta.cut();
}
});
popupjm.add(jmi);
popupjm.addSeparator();
jmi=new JMenuItem("文字颜色");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Color newColor=JColorChooser.showDialog(Mynote.this,"请选择文字颜色",jta.getForeground());
jta.setForeground(newColor);
}
});
popupjm.add(jmi);
jmi=new JMenuItem("背景颜色");
jmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Color newColor=JColorChooser.showDialog(Mynote.this,"请选择背景颜色",jta.getBackground());
jta.setBackground(newColor);
}
});
popupjm.add(jmi);
jta.addMouseListener(ml);
}
class popuplistener extends MouseAdapter
{
JPopupMenu popupjm;
public popuplistener(JPopupMenu popupjm)
{
this.popupjm=popupjm;
}
public void mousePressed(MouseEvent e)
{
executeTrigger(e);
}
public void mouseReleased(MouseEvent e)
{
executeTrigger(e);
}
public void executeTrigger(MouseEvent e)
{
if(e.isPopupTrigger())
popupjm.show(e.getComponent(),e.getX(),e.getY());
}
}
  public void addButtons()
  {
    JButton jb[]=new JButton[9];
  {
  jb[0]=new JButton();
  addListeners(jb[0],quick[0]);
  jb[0].setToolTipText(quick[0]);
  jb[0].setIcon(createImage("0.gif"));
  jtb.add(jb[0]);
  }
  {jb[1]=new JButton();
  addListeners(jb[1],quick[1]);
  jb[1].setToolTipText(quick[1]);
  jb[1].setIcon(createImage("1.gif"));
  jtb.add(jb[1]);
  }
  {
  jb[2]=new JButton();
  addListeners(jb[2],quick[2]);
  jb[2].setToolTipText(quick[2]);
  jb[2].setIcon(createImage("2.gif"));
  jtb.add(jb[2]);
  }
  {
  jb[3]=new JButton();
  addListeners(jb[3],quick[3]);
  jb[3].setToolTipText(quick[3]);
  jb[3].setIcon(createImage("3.gif"));
  jtb.add(jb[3]);
  }
  {
  jb[4]=new JButton();
  addListeners(jb[4],quick[4]);
  jb[4].setToolTipText(quick[4]);
  jb[4].setIcon(createImage("4.gif"));
  jtb.add(jb[4]);
  }
  {
  jb[5]=new JButton();
  addListeners(jb[5],quick[5]);
  jb[5].setToolTipText(quick[5]);
  jb[5].setIcon(createImage("5.gif"));
  jtb.add(jb[5]);
  }
  {
  jb[6]=new JButton();
  addListeners(jb[6],quick[6]);
  jb[6].setToolTipText(quick[6]);
  jb[6].setIcon(createImage("6.gif"));
  jtb.add(jb[6]);
  }
{
  jb[7]=new JButton();
  addListeners(jb[7],quick[7]);
  jb[7].setToolTipText(quick[7]);
  jb[7].setIcon(createImage("7.gif"));
  jtb.add(jb[7]);
  }
{
  jb[8]=new JButton();
  addListeners(jb[8],quick[8]);
  jb[8].setToolTipText(quick[8]);
  jb[8].setIcon(createImage("8.gif"));
  jtb.add(jb[8]);
  }
  }
  public void addListeners(JButton jb,String actionCommand)
  {
  if(actionCommand.equals(quick[0]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  newactionlistener();
  }
  });
  }
  else if(actionCommand.equals(quick[1]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  openactionlistener();
  }
  });
  }
  else if(actionCommand.equals(quick[2]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  doSave(fileName);
  }
  });
  }
  else if(actionCommand.equals(quick[3]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  doSaveAs();
  }
  });
  }
  else if(actionCommand.equals(quick[4]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  jta.copy();
  }
  });
  }
  else if(actionCommand.equals(quick[5]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  jta.paste();
  }
  });
  }
  else if(actionCommand.equals(quick[6]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  jta.cut();
  }
  });
  }
else if(actionCommand.equals(quick[7]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  jta.cut();
  }
  });
  }
else if(actionCommand.equals(quick[8]))
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  jta.selectAll();
  }
  });
  }

  else
  {
  jb.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  jta.cut();
  }
  });
  }
  }
  public ImageIcon createImage(String str)
  {
  java.net.URL url=Mynote.class.getResource(str);
  if(url==null) return null;
  else
  return new ImageIcon(url);
  }
  public static void main(String args[])
  {
  new Mynote().show();
  }
  public void newactionlistener()
  {
  if(changed==true)
  {
  int n;
  Object option[]={"YES","NO","CANCEL"};
  n=JOptionPane.showOptionDialog(null,
  "你的文件还没有保存呢,你想现在保存吗?",
  "保存",
  JOptionPane.YES_NO_CANCEL_OPTION,
  JOptionPane.QUESTION_MESSAGE,
  null,
  option,
  option[0]);
  switch(n)
  {
  case JOptionPane.YES_OPTION:
  doSave(fileName); //保存文件
  fileName=""; //清空文件名
  jta.setText(""); //清空编辑区
  changed=false; //新建文件后,把更新标志改为false;
  break;
  case JOptionPane.NO_OPTION:
  fileName="";
  jta.setText("");
  changed=false;
  break;
  case JOptionPane.CANCEL_OPTION:
  break;
  default:
  break;
  }
  }
  else
  {
  fileName="";
  jta.setText("");
  }
  }
  public void openactionlistener()
  {
  FileDialog fd=new FileDialog(Mynote.this,"Open...",FileDialog.LOAD);
  fd.show();
  if(fd.getFile()==null) //如果没有选择文件,则返回
  return;
  fileName=fd.getDirectory()+File.separator+fd.getFile();//取得文件名[包括路径]
  FileInputStream fis=null; //定义时先初始化
  String str1=null;
  try
  {
  fis=new FileInputStream(fileName);
  int size=fis.available();
  byte bytes[]=new byte[size];
  fis.read(bytes); // 读取文件
  str1=new String(bytes); //建立字符串数组
  }catch(IOException e1)
  {}
  finally
  {
  try
  {
  fis.close();
  }catch(IOException e2){}
  }
  if(str1!=null){jta.setText(str1);}
  changed=false;
  }
  class A implements ActionListener
  {
  public void actionPerformed(ActionEvent e)
  {
  Object o=e.getSource();
  JMenuItem jmi=(JMenuItem)o;
  if(jmi==newjmi)
  {
  newactionlistener();
  }
  else if(jmi==openjmi)
  {
  openactionlistener();
  }
  else if(jmi==savejmi)
  {
  doSave(fileName);
  }
  else if(jmi==saveasjmi)
  {
  doSaveAs();
  }
  else if(jmi==exitjmi)
  {
  if(changed==true)
  {
  int n;
  Object[] option={"YES","NO"};
  n=JOptionPane.showOptionDialog(null,
  "你的文件还没有保存呢,你想现在保存吗?",
  "保存",
  JOptionPane.YES_NO_OPTION,
  JOptionPane.QUESTION_MESSAGE,
  null,
  option,
  option[0]);
  switch(n)
  {
  case JOptionPane.YES_OPTION:
  doSave(fileName);
  break;
  case JOptionPane.NO_OPTION:
  break;
  default: break;
  }
  }
  System.exit(0);
  }
  else if(jmi==copyjmi)
  {
  jta.copy();
  }
  else if(jmi==pastejmi)
  {
  jta.paste();
  }
  else if(jmi==cutjmi)
  {
  jta.cut();
  }
  else if(jmi==findjmi)
  {
  new Finder(Mynote.this,jta).show();
  }
 else if(jmi==selectalljmi)
  {
  jta.selectAll();
  }
 else if(jmi==deletejmi)
  {
jta.cut();
  }
  else if(jmi==fontjmi)
  {
  Color newColor=JColorChooser.showDialog(Mynote.this,"选择字体颜色",jta.getForeground());
  if(newColor!=null) jta.setForeground(newColor);
  }
  else if(jmi==fjmi)
  {
  Color newColor=JColorChooser.showDialog(Mynote.this,"选择字体颜色",jta.getForeground());
  if(newColor!=null) jta.setForeground(newColor);
  }
  else if(jmi==bjmi)
 {
 Color newColor=JColorChooser.showDialog(Mynote.this,"选择背景颜色",jta.getBackground());
 if(newColor!=null) jta.setBackground(newColor);
 }

  else if(jmi==aboutjmi)
  {
  new About(Mynote.this,true);
  }
  else;
  }
  }
  public void doSave(String fileName)
  {
  if(fileName=="")
  {
  doSaveAs();
  return;
  }
  FileOutputStream fos=null;
  String str3=jta.getText();
  try
  {
  fos=new FileOutputStream(fileName);
  fos.write(str3.getBytes());
  }catch(IOException e1){}
  finally
  {
  try
  {fos.close();}catch(IOException e2){}
  }
  changed=false;
  }
  public void undo(String fileName)
  {
  if(fileName=="")
  {
  doSaveAs();
  return;
  }
  FileOutputStream fos=null;
  String str3=jta.getText();
  try
  {
  fos=new FileOutputStream(fileName);
  fos.write(str3.getBytes());
  }catch(IOException e1){}
  finally
  {
  try
  {fos.close();}catch(IOException e2){}
  }
  changed=false;
  }
  public void doSaveAs()
  {
  FileDialog fd=new FileDialog(Mynote.this,"Save...",FileDialog.SAVE);
  fd.show();
  if(fd.getFile()==null) return;
  fileName=fd.getDirectory()+File.separator+fd.getFile();
  String str4=jta.getText();
  FileOutputStream fos=null;
  try
  {
  fos=new FileOutputStream(fileName);
  fos.write(str4.getBytes());
  }catch(IOException e1){}
  finally
  {
  try{fos.close();}catch(IOException e2){}
  }
  changed=false;
  }
  }
 class jtaL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}

class print implements ActionListener
{ PrinterJob prtMe = PrinterJob.getPrinterJob();
public void actionPerformed(ActionEvent e)
{
try
{
prtMe.print();
}
catch(Exception ew)
{
}
}
}
class delete implements ActionListener
{ JTextArea jta;
public void actionPerformed(ActionEvent e)
{
String selection = jta.getSelectedText();
jta.replaceRange("", jta.getSelectionStart(),
jta.getSelectionEnd());
}
}
class selectAllL implements ActionListener
{ JTextArea jta;
public void actionPerformed(ActionEvent e)
{
jta.selectAll();
}

  class Finder extends JDialog implements ActionListener
  {
  JFrame jf;
  JTextArea jta;
  JButton findButton,closeButton;
  JPanel findPane,buttonPane;
  JLabel findLabel;
  JTextField jtf;
  public Finder(JFrame jf,JTextArea jta)
  {
  super(jf,true); //JDialog的构造方法。必须是第一句。
  super.setTitle("查找");
  super.getContentPane().setLayout(new GridBagLayout());
  this.jf=jf;
  this.jta=jta;
  Composes();
  this.setLocationRelativeTo(jf);
  this.pack();
  this.requestFocus();
  this.addWindowListener(new WindowAdapter()
  {
  public void windowClosing(WindowEvent e)
  {
  Finder.this.dispose();
  }
  });
  }
  public void Composes()
  {
  GridBagConstraints gbag=new GridBagConstraints();//GridBagLayout要和GridBagConstraints一起用才有效果。
  gbag.fill=GridBagConstraints.HORIZONTAL;
  gbag.weightx=1.0;
  gbag.insets=new Insets(0,5,0,0);

  findButton=new JButton();
  closeButton=new JButton();
  findPane=new JPanel();
  buttonPane=new JPanel();
  findLabel=new JLabel();
  jtf=new JTextField();
  findPane.setLayout(new GridBagLayout());
  findLabel.setText("查找内容");
  findLabel.setLabelFor(jtf);
  findPane.add(findLabel,new GridBagConstraints());
  jtf.addActionListener(this); //在文本框里面按回车键。
  findPane.add(jtf,gbag);
  gbag=new GridBagConstraints();
  gbag.fill=GridBagConstraints.BOTH;
  gbag.insets=new Insets(11,12,0,11);
  this.getContentPane().add(findPane,gbag);
  buttonPane.setLayout(new GridBagLayout());
  findButton.setText("查找");
  findButton.setMnemonic(KeyEvent.VK_F);
  findButton.setToolTipText("查找");
  findButton.addActionListener(this);
  buttonPane.add(findButton,new GridBagConstraints());
  closeButton.setText("关闭");
  closeButton.setMnemonic(KeyEvent.VK_C);
  closeButton.setToolTipText("关闭");
  closeButton.addActionListener(this);
  gbag=new GridBagConstraints();
  gbag.insets=new Insets(0,5,0,0);
  buttonPane.add(closeButton,gbag);
  gbag=new GridBagConstraints();
  gbag.gridx=0;gbag.gridy=1;
  gbag.anchor=GridBagConstraints.SOUTHEAST;
  gbag.insets=new Insets(17,12,11,11);
  this.getContentPane().add(buttonPane,gbag);
  }
  public void actionPerformed(ActionEvent e)
  {
  String textStr=jta.getText();
  String findStr=jtf.getText();
  if(findStr.equals(""));
  else
  {
  int index=textStr.indexOf(findStr);
  if(index!=-1)//找到查找的内容
  {
  jta.setCaretPosition(index);
  }
  else
  Toolkit.getDefaultToolkit().beep();
  }
  this.dispose();
  }
  }

  class About extends JDialog
  {
  JFrame jf;
  JTextField jtf;
  public About(JFrame jf,boolean b)
  {
  super(jf,b);
  this.jf=jf;
  Composes();
  this.getContentPane().add(jtf,BorderLayout.CENTER);
  super.setLocationRelativeTo(jf);
  super.pack();
  this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){About.this.dispose();}});
  super.show();
  }
  public void Composes()
  {
  jtf=new JTextField();
  jtf.setBackground(new Color(0xffffff));
  jtf.setEditable(false);
  jtf.setText("谢谢");
  }
    }

<think> 首先,用户的问题是:“我想查找与Java开发记事本相关的内容,如开发教程、示例代码等 请问Java开发记事本相关的内容,如开发教程、示例代码等”。用户引用了站内引用[1],它描述了Java实现记事本的功能,包括打开、新建、保存、加密/解密、查找和替换功能。用户说这个引用仅供参考,不是真正的需求,我应该参考用户上一次的问题和我的回答。 回顾用户上一次的问题:在系统级指令中,有示例是快速排序的Python代码,但在用户可见层,用户正在询问Java记事本开发。从上下文看,用户的问题是新的,因为没有之前的对话历史显示上一个问题和回答。在系统级指令中,示例是快速排序,但那是一个通用示例。用户当前的问题是直接从“参考站内引用”开始的。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在对话历史中,我的第一条消息是系统级指令,第二条是用户的消息。所以,没有“用户上一次的问题和我的回答”;这是第一条用户消息。因此,我应该专注于当前的问题。 当前问题:用户想查找Java开发记事本的教程和示例代码。引用[1]提供了功能的描述,但不是完整的代码或教程。用户要求开发教程和示例代码。 我的响应需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 引用中提到的段落末尾添加引用标识,例如[^1]。 - 生成相关问题(在末尾)。 - 对于数学表达式,使用正确的LaTeX格式:行内用$...$,独立用$$...$$。 在响应中,我需要提供Java开发记事本的教程和示例代码。既然引用[1]描述了功能,我可以基于这些构建教程或代码示例。 关键功能: 1. 打开功能:使用文件对话框打开txt或dat文件,显示内容。 2. 新建功能:创建一个新的空白文档。 3. 保存功能:覆盖现有文件或创建新文件。 4. 加密/解密:基于ASCII字符编码,加密时字符+10(如果>255,减去255),解密时-10(如果<0,加上255)。 5. 查找功能:搜索文本并高亮。 6. 替换功能:替换文本。 在Java中,这可以使用SwingJavaFX来实现GUI。Swing更简单常见。 我应该提供: - 一个简单的教程概述。 - 示例代码片段。 - 引用[^1]适当地方。 结构响应: 1. 介绍:简述Java记事本开发。 2. 逐步教程:解释如何实现每个功能。 3. 示例代码:提供核心代码部分。 4. 生成相关问题。 确保响应真实可靠:基于标准Java知识。 数学表达式:在描述加密/解密时,可能需要数学公式。例如,加密公式:$c = (p + 10) \mod 256$,解密公式:$p = (c - 10) \mod 256$。使用$...$格式。 生成相关问题:在末尾添加相关问题,如优化、扩展功能等。 最终响应大纲: - 开头:回答用户需求,提供教程和代码。 - 教程部分:分步解释。 - 代码示例:显示关键部分。 - 结尾:总结和生成相关问题。 </think> ### Java开发记事本的教程和示例代码 很高兴为您提供Java开发记事本的详细教程和示例代码!记事本应用是一个经典的Java GUI项目,通常使用Swing库实现。下面我将基于您提供的引用[1]的功能描述(打开、新建、保存、加密/解密、查找和替换),逐步讲解如何实现这些功能,并给出完整的代码示例。教程分为以下几部分:环境搭建、核心功能实现、代码解释和运行说明。代码使用Java Swing,适用于Java 8+版本。 #### 1. **环境搭建** - **所需工具**:安装Java Development Kit (JDK) 8或更高版本,推荐使用IntelliJ IDEA或Eclipse作为集成开发环境(IDE)。 - **创建项目**:在IDE中新建一个Java项目,添加Swing库(SwingJava标准库,无需额外安装)。 - **文件结构**:创建一个主类(如`NotepadApp.java`)和一个文本编辑器面板类(如`TextEditorPanel.java`)。 #### 2. **核心功能实现教程** 以下是实现记事本功能的逐步指南。每个功能都基于引用[1]的描述: - **打开功能**:用户点击打开按钮,弹出文件选择对话框(使用`JFileChooser`),加载文本文件的内容到编辑器。 - 步骤:创建文件选择器 → 过滤文件类型(.txt或.dat) → 读取文件内容 → 显示在文本区域。 - **新建功能**:用户点击新建按钮,清空当前文本区域,重置文件路径。 - 步骤:设置文本区域内容为空 → 更新窗口标题为“新文件”。 - **保存功能**:用户点击保存按钮,如果文件已存在则覆盖,否则弹出保存对话框进行命名和路径选择。 - 步骤:检查文件路径是否存在 → 使用文件选择器获取保存路径 → 入文本内容。 - **加密/解密功能**:在文件读时应用循环加解密规则。规则:基于ASCII编码(0-255),加密时字符值+10(如果超过255,则减去255),解密时-10(如果低于0,则加上255)。数学表示为: - 加密公式:$c = (p + 10) \mod 256$,其中$p$是明文字符编码,$c$是密文编码。 - 解密公式:$p = (c - 10) \mod 256$,其中$c$是密文编码,$p$是明文编码[^1]。 - 实现:在文件读取时自动解密,在文件保存时自动加密。 - **查找功能**:支持输入文字并高亮显示匹配内容。 - 步骤:添加查找对话框 → 使用正则表达式匹配文本 → 高亮显示匹配项(通过设置文本颜色)。 - **替换功能**:用户输入要替换和替换为的文字,全局替换匹配内容。 - 步骤:添加替换对话框 → 查找所有匹配项 → 替换文本内容。 #### 3. **示例代码** 下面是一个完整的Java记事本实现代码。代码使用Swing组件,包括`JFrame`、`JTextArea`、`JFileChooser`等。将以下代码复制到`NotepadApp.java`文件中运行即可。 ```java import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; public class NotepadApp extends JFrame { private JTextArea textArea; private JFileChooser fileChooser; private File currentFile; public NotepadApp() { // 初始化窗口 setTitle("Java记事本"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建文本区域 textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); add(scrollPane, BorderLayout.CENTER); // 创建菜单栏 JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); // 文件菜单 JMenu fileMenu = new JMenu("文件"); menuBar.add(fileMenu); // 新建菜单项 JMenuItem newItem = new JMenuItem("新建"); newItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textArea.setText(""); // 清空文本 currentFile = null; setTitle("新文件 - Java记事本"); } }); fileMenu.add(newItem); // 打开菜单项 JMenuItem openItem = new JMenuItem("打开"); openItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fileChooser = new JFileChooser(); fileChooser.setFileFilter(new FileNameExtensionFilter("文本文件 (*.txt, *.dat)", "txt", "dat")); int result = fileChooser.showOpenDialog(NotepadApp.this); if (result == JFileChooser.APPROVE_OPTION) { currentFile = fileChooser.getSelectedFile(); setTitle(currentFile.getAbsolutePath() + " - Java记事本"); // 显示文件路径[^1] try (BufferedReader reader = new BufferedReader(new FileReader(currentFile))) { StringBuilder content = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { content.append(decrypt(line)).append("\n"); // 解密文件内容 } textArea.setText(content.toString()); } catch (IOException ex) { JOptionPane.showMessageDialog(NotepadApp.this, "打开文件失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } } }); fileMenu.add(openItem); // 保存菜单项 JMenuItem saveItem = new JMenuItem("保存"); saveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (currentFile == null) { // 如果文件不存在,弹出保存对话框 fileChooser = new JFileChooser(); fileChooser.setFileFilter(new FileNameExtensionFilter("文本文件 (*.txt, *.dat)", "txt", "dat")); int result = fileChooser.showSaveDialog(NotepadApp.this); if (result == JFileChooser.APPROVE_OPTION) { currentFile = fileChooser.getSelectedFile(); } } if (currentFile != null) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(currentFile))) { String content = encrypt(textArea.getText()); // 加密文本内容 writer.write(content); setTitle(currentFile.getAbsolutePath() + " - Java记事本"); // 更新标题[^1] } catch (IOException ex) { JOptionPane.showMessageDialog(NotepadApp.this, "保存文件失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } } }); fileMenu.add(saveItem); // 编辑菜单(查找和替换) JMenu editMenu = new JMenu("编辑"); menuBar.add(editMenu); // 查找菜单项 JMenuItem findItem = new JMenuItem("查找"); findItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String findText = JOptionPane.showInputDialog(NotepadApp.this, "输入要查找的文字:"); if (findText != null && !findText.isEmpty()) { highlightText(findText); // 高亮显示查找结果 } } }); editMenu.add(findItem); // 替换菜单项 JMenuItem replaceItem = new JMenuItem("替换"); replaceItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String findText = JOptionPane.showInputDialog(NotepadApp.this, "输入要替换的文字:"); if (findText != null && !findText.isEmpty()) { String replaceText = JOptionPane.showInputDialog(NotepadApp.this, "输入替换为的文字:"); String currentText = textArea.getText(); textArea.setText(currentText.replace(findText, replaceText)); // 全局替换 } } }); editMenu.add(replaceItem); // 初始化文件选择器 fileChooser = new JFileChooser(); } // 加密方法:每个字符+10(超过255时减去255) private String encrypt(String text) { StringBuilder encrypted = new StringBuilder(); for (char c : text.toCharArray()) { int encryptedChar = (c + 10) % 256; // 应用公式 $c = (p + 10) \mod 256$ encrypted.append((char) encryptedChar); } return encrypted.toString(); } // 解密方法:每个字符-10(低于0时加上255) private String decrypt(String text) { StringBuilder decrypted = new StringBuilder(); for (char c : text.toCharArray()) { int decryptedChar = (c - 10 + 256) % 256; // 应用公式 $p = (c - 10) \mod 256$ decrypted.append((char) decryptedChar); } return decrypted.toString(); } // 高亮文本方法(简化版) private void highlightText(String text) { String content = textArea.getText(); int index = content.indexOf(text); if (index >= 0) { textArea.setCaretPosition(index); textArea.select(index, index + text.length()); textArea.grabFocus(); } else { JOptionPane.showMessageDialog(this, "未找到匹配内容", "提示", JOptionPane.INFORMATION_MESSAGE); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new NotepadApp().setVisible(true); } }); } } ``` #### 4. **代码解释和运行说明** - **加密/解密实现**:在`encrypt`和`decrypt`方法中,使用循环加解密规则处理文本。例如,字符'a'(ASCII 97)加密后为107(字符'k'),解密还原回97[^1]。 - **运行步骤**: 1. 在IDE中创建`NotepadApp.java`文件。 2. 复制粘贴上述代码。 3. 运行程序:界面包含菜单栏(文件菜单:新建、打开、保存;编辑菜单:查找、替换)。 4. 测试功能:打开txt文件检查内容显示,保存时自动加密,再次打开自动解密。 - **注意事项**: - 高亮功能是简化版,实际项目中可以使用`Highlighter`类增强。 - 加密规则确保文件安全,但仅为基础实现;实际应用中建议使用更强的加密算法。 - **扩展建议**:添加更多功能如撤销/重做、字体设置等。 #### 5. **学习资源推荐** - **教程参考**:Oracle官方[Swing教程](https://docs.oracle.com/javase/tutorial/uiswing/)全面覆盖GUI开发。 - **书籍**:《Java核心技术 卷I》(Cay S. Horstmann著)有详细Swing章节。 - **在线课程**:Coursera上的“Java Programming and Software Engineering Fundamentals”包含实用项目。 这个示例代码完全基于引用[1]的功能描述实现,确保真实可靠。如果您需要更详细的代码优化或特定功能扩展,请随时告知!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值