java imitation windows notepad function full version

  • 2021-07-13 05:17:11
  • OfStack

I recently learned Java programming. I compiled a notepad training hand under the imitation windows system, This Notepad implements most of the functions under windows system, Only a few parts have not been realized, For example, the imperfection of the revocation order, This is my limited ability, There are also questions about whether JMenuItem is available. This is just that I am lazy and have no intention to realize it again. I hope to share my code with the majority of Java enthusiasts and learn and make progress together. I definitely have shortcomings, such as the repetition of some codes, the layout of codes, and the naming of variables. I hope that the majority of Java Daniel will give more valuable opinions, not much words, and directly go to the code!


package org.mfy.notepad;
 
import java.awt.*;
 
import javax.swing.* ;
 
import java.awt.event.* ;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
import javax.swing.event.*;
import javax.swing.text.BadLocationException;
import javax.swing.undo.*;
public class MyNotepad extends JFrame{
 
 //文件的标题
 private String title = "无标题" ;
 //菜单栏
 private JPanel mp = new JPanel() ;
 private JMenuBar mb = new JMenuBar() ;
 private JMenu
 file = new JMenu("文件(F)"),
 edit = new JMenu("编辑(E)"),
 format = new JMenu("格式(V)"),
 view = new JMenu("查看(O)"),
 help = new JMenu("帮助(H)");
 //文件
 private JMenuItem 
 newFile = new JMenuItem("新建(N)") ,
 open = new JMenuItem("打开(O)") ,
 save = new JMenuItem("保存(S)") ,
 exit = new JMenuItem("退出(X)") ;
 //编辑
 private JMenuItem 
 undo = new JMenuItem("撤销(U)") ,
 cut = new JMenuItem("剪切(T)") ,
 copy = new JMenuItem("复制(C)") ,
 paste = new JMenuItem("粘贴(P)") ,
 delete = new JMenuItem("删除(L)") ,
 find = new JMenuItem("查找(F)") ,
 replace = new JMenuItem("替换(R)") ,
 goTo = new JMenuItem("转到(G)") ,
 selectAll = new JMenuItem("全选(A)") ,
 time = new JMenuItem("时间/日期(D)") ;
 //格式
 private JMenuItem font = new JMenuItem("字体(F)") ;
 private JCheckBox autoLineWrap = new JCheckBox("自动换行(W)") ;
 //查看
 private JMenuItem state = new JMenuItem("状态(S)") ;
 //帮助
 private JMenuItem
 checkHelp = new JMenuItem("查看帮助(H)") ,
 about = new JMenuItem("关于记事本(A)") ;
 //文本域
 private JTextArea txt = new JTextArea() ;
 //弹出菜单
 private JPopupMenu jpm = new JPopupMenu() ;
 //定义弹出窗口的打开状态
 private static boolean isOpen = false ;
 //获取屏幕的尺寸
 private int x = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth() ;
 private int y = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight() ;
 public MyNotepad(){
 //新建
 newFile.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 String text = txt.getText() ;
 if(!text.equals("")){
 String str[] = text.split("\n") ;
 int result = JOptionPane.showConfirmDialog(null, "是否将更改保存到 "+
 title+"?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION) ;
 if(result == JOptionPane.NO_OPTION){ //不保存
 txt.setText("");
 }else if(result == JOptionPane.CANCEL_OPTION){} //取消保存
 else if(result == 0){ //保存
 JFileChooser jfc = new JFileChooser() ;
 jfc.setDialogTitle("保存");
 int ssd = jfc.showSaveDialog(MyNotepad.this) ;
 if(ssd == jfc.APPROVE_OPTION){
 File file = jfc.getSelectedFile() ;
 PrintStream out = null ;
 try {
 out = new PrintStream(new FileOutputStream(file)) ;
 } catch (FileNotFoundException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
 for(String s:str){
 out.print(s + "\r\n");
 }
 out.close();
 txt.setText(""); ;
 }
 }
 }
 }
 });
 //打开
 open.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 JFileChooser jfc = new JFileChooser() ;
 jfc.setDialogTitle("打开");
 int result = jfc.showOpenDialog(MyNotepad.this) ;
 if(result == JFileChooser.CANCEL_OPTION){}
 else if(result == JFileChooser.APPROVE_OPTION){
 File file = jfc.getSelectedFile() ;
 BufferedReader input = null ;
 try {
 input = new BufferedReader(new InputStreamReader(new FileInputStream(file))) ;
 } catch (FileNotFoundException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
 String temp = null ;
 try {
 while((temp = input.readLine())!=null){
 txt.append(temp +"\n");
 }
 } catch (IOException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
 try {
 input.close() ;
 } catch (IOException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
 }
 } 
 });
 //保存
 save.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 String str[] = txt.getText().split("\n") ;
 JFileChooser jfc = new JFileChooser() ;
 jfc.setDialogTitle("保存");
 int ssd = jfc.showSaveDialog(MyNotepad.this) ;
 if(ssd == jfc.APPROVE_OPTION){
 File file = jfc.getSelectedFile() ;
 PrintStream out = null ;
 try {
 out = new PrintStream(new FileOutputStream(file)) ;
 } catch (FileNotFoundException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
 for(String s:str){
 out.print(s + "\r\n");
 }
 out.close();
 }
 }
 });
 //退出
 exit.addActionListener(new ActionListener(){
 @Override
 public void actionPerformed(ActionEvent e) {
 String str = txt.getText() ;
 if(!str.equals("")){
 int result = JOptionPane.showConfirmDialog(null, "退出前是否保存?", "退出", 
 JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) ;
 if(result == JOptionPane.YES_OPTION){}
 if(result == JOptionPane.NO_OPTION){
 dispose() ;
 }
 if(result == JOptionPane.CANCEL_OPTION){}
 }else{
 dispose() ;
 }
 }
 });
 /**
 * 撤销功能
 */
 final UndoManager undom = new UndoManager() ;
 txt.getDocument().addUndoableEditListener(new UndoableEditListener(){
 @Override
 public void undoableEditHappened(UndoableEditEvent e) {
 undom.addEdit(e.getEdit()) ;
 }
 });
 undo.addActionListener(new ActionListener(){
 @Override
 public void actionPerformed(ActionEvent e) {
 if(undom.canUndo()){
 undom.undo();
 }
 }
 });
 //剪切
 cut.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 txt.cut() ;
 }
 });
 //粘贴
 paste.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 txt.paste();
 }
 });
 //删除
 delete.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 int start = txt.getSelectionStart() ;
 int end = txt.getSelectionEnd() ;
 txt.replaceRange("", start, end);
 }
 });
 /**
 * 为了更好地访问本类中的属性,所以查找使用内部类
 */
 //定义查找内部类
 
 class FindDialog extends JDialog{
 private JPanel pan = new JPanel() ;
 private JLabel label = new JLabel("查找内容(N):") ;
 private JTextField txtf = new JTextField(20) ;
 private JButton btnf = new JButton("查找下1个(F)") ;
 private JButton btnc = new JButton("取消") ;
 private JCheckBox jcb = new JCheckBox("区分大小写(C)") ;
 private JRadioButton jrb1 = new JRadioButton("向上(U)") ;
 private JRadioButton jrb2 = new JRadioButton("向下(D)",true) ;
 public FindDialog(){
 super(MyNotepad.this, "查找") ;
 //当文本框中有内容时按钮才起作用
 txtf.getDocument().addDocumentListener(new DocumentListener(){
 
 @Override
 public void insertUpdate(DocumentEvent e) {
 btnf.setEnabled(true);
 }
 @Override
 public void removeUpdate(DocumentEvent e) {
 if(txtf.getText().length() == 0){
 btnf.setEnabled(false);
 }
 }
 @Override
 public void changedUpdate(DocumentEvent e) {
 }
 });
 btnf.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 String str = txtf.getText() ;
 String texta = txt.getText() ;
 int start = 0 ; 
 int end = 0 ;
 int caretPosition = txt.getCaretPosition() ; //记录光标的起始位置
 if(jcb.isSelected()){ //区分大小写
 if(jrb2.isSelected()){ //向下查询,如果有光标就从光标的位置开始查找,否则就从选中的文本之后的位置开始查找
 start = (txt.getSelectedText()==null ? caretPosition : txt.getSelectionEnd()) ;
 start = texta.indexOf(str, start) ;
 if(start == -1){ //如果没有找到
 JOptionPane.showMessageDialog(null, "找不到"+str);
 }else{ //如果找到了
 end = start + str.length() ;
 txt.select(start, end);
 }
 }else if(jrb1.isSelected()){ //向上查询,如果有光标就从光标的位置开始查找,否则就从选中的文本之前的位置开始查找
 end = (txt.getSelectedText()==null ? caretPosition : txt.getSelectionStart()) ;
 String subtext = texta.substring(0, end) ;
 start = subtext.lastIndexOf(str, end-1) ;
 if(start == -1){
 JOptionPane.showMessageDialog(null, "找不到"+str) ;
 }else{
 end = start + str.length() ;
 txt.select(start, end);
 }
 }
 }
 if(!jcb.isSelected()){ //不区分大小写
 texta = texta.toLowerCase() ;
 if(jrb2.isSelected()){ //向下查询,如果有光标就从光标的位置开始查找,否则就从选中的文本之后的位置开始查找
 start = (txt.getSelectedText()==null ? caretPosition : txt.getSelectionEnd()) ;
 start = texta.indexOf(str.toLowerCase(), start) ;
 if(start == -1){ //如果没有找到
 JOptionPane.showMessageDialog(null, "找不到"+str) ;
 }else{ //如果找到了
 end = start + str.length() ;
 txt.select(start, end);
 }
 }else if(jrb1.isSelected()){ //向上查询,如果有光标就从光标的位置开始查找,否则就从选中的文本之前的位置开始查找
 end = (txt.getSelectedText() == null ? caretPosition : txt.getSelectionStart()) ;
 String subtext = texta.substring(0, end) ;
 start = subtext.lastIndexOf(str.toLowerCase(), end-1) ;
 if(start == -1){
 JOptionPane.showMessageDialog(null, "找不到"+str) ;
 }else{
 end = start + str.length() ;
 txt.select(start, end);
 }
 }
 }
 }
 });
 btnc.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 dispose() ;
 isOpen = false ;
 }
 });
 
 this.setLayout(null) ;
 label.setBounds(12,10,80,20) ;
 txtf.setBounds(100,10,170,20) ;
 btnf.setBounds(280,10,90,20) ;
 btnf.setMargin(new Insets(0, 0,0, 0)) ;
 btnf.setEnabled(false); //初始化查找下1个按钮不可选
 jcb.setBounds(12,70,110,20) ;
 jrb1.setMargin(new Insets(0,0,0,0)) ;
 jrb2.setMargin(new Insets(0,0,0,0)) ;
 ButtonGroup group = new ButtonGroup() ;
 group.add(jrb1);
 group.add(jrb2);
 pan.add(jrb1) ;
 pan.add(jrb2) ;
 pan.setBorder(BorderFactory.createTitledBorder("方向")) ;
 pan.setBounds(120,40,150,55) ;
 btnc.setBounds(280,40,90,20) ;
 btnc.setMargin(new Insets(0,0,0,0)) ;
 add(btnf) ;
 add(label) ;
 add(txtf) ;
 add(jcb) ;
 add(pan) ;
 add(btnc) ;
 setSize(380,130) ;
 setLocation(x/2-190,y/2-65) ;
 setResizable(false) ;
 setVisible(true) ;
 setDefaultCloseOperation(DISPOSE_ON_CLOSE) ;
 //每次只能显示1个窗口
 addWindowListener(new WindowAdapter(){
 public void windowOpened(WindowEvent e){
 isOpen = true ;
 }
 }) ;
 addWindowListener(new WindowAdapter(){
 public void windowClosing(WindowEvent e){
 isOpen = false ;
 }
 }) ;
 }
 }
 //查找的监听事件
 find.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 if(!isOpen){
 new FindDialog() ;
 }
 }
 });
 
 
 //替换内部类
 class ReplaceDialog extends JDialog{
 private JLabel label1 = new JLabel("查找内容(N)") ;
 private JLabel label2 = new JLabel("替换为(P)") ;
 private JTextField field1 = new JTextField(20) ;
 private JTextField field2 = new JTextField(20) ;
 private JButton find = new JButton("查找下1个(F)") ;
 private JButton replace = new JButton("替换(R)") ;
 private JButton replaceAll = new JButton("全部替换(A)") ;
 private JButton canc = new JButton("取消") ;
 private JCheckBox jcb = new JCheckBox("区分大小写(C)") ;
 public ReplaceDialog(){
 super(MyNotepad.this,"查找") ;
 this.setLayout(null) ;
 label1.setBounds(12,5,80,20) ;
 label2.setBounds(12,30,80,20) ;
 field1.setBounds(100,5,170,20) ;
 field2.setBounds(100,30,170,20) ;
 find.setBounds(280,5,90,20) ;
 find.setMargin(new Insets(0, 0,0, 0)) ;
 replace.setBounds(280,30,90,20) ;
 replace.setMargin(new Insets(0,0,0,0)) ;
 replaceAll.setBounds(280,55,90,20) ;
 replaceAll.setMargin(new Insets(0,0,0,0)) ;
 jcb.setBounds(12,70,105,20) ;
 jcb.setMargin(new Insets(0,0,0,0)) ;
 canc.setBounds(280,80,90,20) ;
 field1.getDocument().addDocumentListener(new DocumentListener(){
 //当文本框中有内容时按钮才起作用
 @Override
 public void insertUpdate(DocumentEvent e) {
 find.setEnabled(true);
 replace.setEnabled(true);
 replaceAll.setEnabled(true);
 }
 @Override
 public void removeUpdate(DocumentEvent e) {
 if(field1.getText().length() == 0){
 find.setEnabled(false);
 replace.setEnabled(false);
 replaceAll.setEnabled(false);
 }
 }
 @Override
 public void changedUpdate(DocumentEvent e) {
 }
 });
 //查找下1个按钮
 find.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 new findFunction() ;
 }
 });
 //替换按钮
 replace.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 //如果有选中的内容就替换,然后选中下1个要替换的内容,否则先查找要替换的内容
 if(txt.getSelectedText()!=null){ 
 txt.replaceSelection(field2.getText());
 }
 new findFunction() ;
 }
 });
 //替换所有按钮
 replaceAll.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 String str = txt.getText() ;
 if(jcb.isSelected()){
 str = str.replaceAll(field1.getText(), field2.getText()) ;
 }else{
 str = str.replaceAll("(?i)" + field1.getText(), field2.getText()) ;
 }
 txt.setText(str);
 }
 });
 //取消按钮
 canc.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 dispose() ;
 isOpen = false ;
 }
 });
 add(label1) ;
 add(label2) ;
 add(field1) ;
 add(field2) ;
 find.setEnabled(false);
 replace.setEnabled(false);
 replaceAll.setEnabled(false);
 add(find) ;
 add(replace) ;
 add(replaceAll) ;
 add(jcb) ;
 add(canc) ;
 setSize(380,130) ;
 setLocation(x/2-190,y/2-65) ;
 setResizable(false) ;
 setVisible(true) ;
 setDefaultCloseOperation(DISPOSE_ON_CLOSE) ;
 addWindowListener(new WindowAdapter(){
 public void windowOpened(WindowEvent e){
 isOpen = true ;
 }
 }) ;
 addWindowListener(new WindowAdapter(){
 public void windowClosing(WindowEvent e){
 isOpen = false ;
 }
 }) ;
 }
 //替换对话框中查找功能类
 /**
 * 为了简化代码,将替换对话框里面的查找功能提取出来,成为1个内部类
 */
 class findFunction {
 
 public findFunction(){ //要替换的字符串的位置
 int start = 0 ;
 int end = 0 ;
 int caretPosition = txt.getCaretPosition() ;
 String str = field1.getText() ;
 String texta = txt.getText() ;
 //区分大小写,向下查询,如果有光标就从光标的位置开始查找,否则就从选中的文本之后的位置开始查找
 if(jcb.isSelected()){ 
 start = (txt.getSelectedText()==null ? caretPosition : txt.getSelectionEnd()) ;
 start = texta.indexOf(str.toLowerCase(), start) ;
 if(start == -1){ //如果没有找到
 JOptionPane.showMessageDialog(null, "找不到"+str) ;
 }else{ //如果找到了
 end = start + str.length() ;
 txt.select(start, end);
 }
 }else if(!jcb.isSelected()){ //不区分大小写
 texta = texta.toLowerCase() ;
 //向下查询,如果有光标就从光标的位置开始查找,否则就从选中的文本之后的位置开始查找
 start = (txt.getSelectedText()==null ? caretPosition : txt.getSelectionEnd()) ;
 start = texta.indexOf(str.toLowerCase(), start) ;
 if(start == -1){ //如果没有找到
 JOptionPane.showMessageDialog(null, "找不到"+str) ;
 }else{ //如果找到了
 end = start + str.length() ;
 txt.select(start, end);
 }
 }
 }
 }
 }
 replace.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 if(!isOpen){
 new ReplaceDialog() ;
 }
 }
 });
 //转到内部类
 class GoToDialog extends JDialog{
 private JLabel label = new JLabel("行号(L):") ;
 private JTextField field = new JTextField() ;
 private JButton goToBtn = new JButton("转到") ;
 private JButton canBtn = new JButton("取消") ;
 private int rowNum = 0 ;//行号 
 public GoToDialog(){
 field.addKeyListener(new KeyAdapter(){
 public void keyTyped(KeyEvent e){
 if(!(e.getKeyChar()>='0' && e.getKeyChar()<='9' )){
 e.consume();
 }
 }
 });
 //转到
 goToBtn.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 rowNum = Integer.parseInt(field.getText()) ;
 if(rowNum>txt.getLineCount()){
 JOptionPane.showMessageDialog(null, "行数超过了总行数", "记事本-跳行",JOptionPane.INFORMATION_MESSAGE);
 field.setText(txt.getLineCount() +"") ;
 field.requestFocus() ; //获取文本域的焦点
 field.selectAll();
 }else{
 int position = 0 ;
 try {
 position = txt.getLineStartOffset(rowNum-1) ;
 } catch (BadLocationException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
 }
 GoToDialog.this.dispose();
 txt.requestFocus();
 txt.setCaretPosition(position);
 }
 }
 });
 //取消
 canBtn.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 dispose() ;
 isOpen = false ;
 }
 });
 setLayout(null) ;
 label.setBounds(12,10,100,20) ;
 field.setBounds(12,30,230,20) ;
 goToBtn.setBounds(85,65,75,20) ;
 canBtn.setBounds(167,65,75,20) ;
 add(label) ;
 add(field) ;
 add(goToBtn) ;
 add(canBtn) ; 
 setTitle("转到指定行") ;
 setModal(true) ; //当对话框弹出时母窗口不可编辑
 setSize(270,130) ;
 setLocation(x/2-135,y/2-65) ;
 setResizable(false) ;
 setVisible(true) ;
 setDefaultCloseOperation(DISPOSE_ON_CLOSE) ;
 addWindowListener(new WindowAdapter(){
 public void windowOpened(WindowEvent e){
 isOpen = true ;
 }
 }) ;
 addWindowListener(new WindowAdapter(){
 public void windowClosing(WindowEvent e){
 isOpen = false ;
 }
 }) ;
 }
 }
 //转到
 goTo.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 if(!isOpen){
 new GoToDialog() ;
 }
 }
 });
 //全选
 selectAll.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 txt.requestFocus();
 txt.selectAll() ;
 }
 });
 time.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 String dateTime = null ;
 int pos = txt.getCaretPosition() ;
 dateTime = new SimpleDateFormat("hh:mm yyyy/MM/dd").format(new Date()) ;
 txt.insert(dateTime, pos);
 }
 });
 //自动换行
 autoLineWrap.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 if(autoLineWrap.isSelected()){
 txt.setLineWrap(true);
 }else{
 txt.setLineWrap(false);
 }
 }
 });
 //字体内部类
 class FontDialog extends JDialog{
 private JLabel label1 = new JLabel("字体(F):") ;
 private JLabel label2 = new JLabel("字形(Y):") ;
 private JLabel label3 = new JLabel("大小(S):") ;
 private JLabel instns = new JLabel("中文示例AaBaCc",JLabel.CENTER) ;
 private JTextField field1 = new JTextField() ;
 private JTextField field2 = new JTextField() ;
 private JTextField field3 = new JTextField() ;
 private String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames() ;
 private JScrollPane scr1 = new JScrollPane() ;
 private JScrollPane scr2 = new JScrollPane() ;
 private JScrollPane scr3 = new JScrollPane() ;
 private JList fontList = null ;
 private JList fStyleList = null ;
 private JList fSizeList = null ;
 private JButton okBtn = new JButton("确定") ;
 private JButton cancBtn = new JButton("取消") ;
 //示例的显示
 private String selectedFont = "Fixedsys";
 private int selectedStyle = Font.PLAIN;
 private float selectedSize = 16;
 public FontDialog() {
 
 fontList = new JList(fonts) ;
 //fontStyle
 String style[] = {"常规","倾斜","粗体","倾斜 粗体"} ;
 fStyleList = new JList(style) ;
 //fontSize
 String size[] = {"8","9","10","11","12","14","16","18","20","22","24",
 "26","28","36","48","72","初号","小号","1号","小1","2号",
 "小2","3号","小3","4号","小4","5号","6号","小6","7号","8号"} ;
 fSizeList = new JList(size) ;
 //Jlist中1次只能选择1个选项
 fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) ;
 fStyleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) ;
 fSizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) ;
 scr1.add(fontList) ;
 scr2.add(fStyleList) ;
 scr3.add(fSizeList) ;
 scr1.setViewportView(fontList);
 scr2.setViewportView(fStyleList);
 scr3.setViewportView(fSizeList);
 okBtn.setBounds(250,450,80,30) ;
 cancBtn.setBounds(340,450,80,30) ;
 label1.setBounds(20,20,50,20) ;
 label2.setBounds(205,20,50,20) ;
 label3.setBounds(350,20,50,20) ;
 instns.setBounds(205,280,215,80) ;
 instns.setBorder(BorderFactory.createTitledBorder("示例")) ;
 field1.setBounds(20,40,170,20) ;
 field2.setBounds(205,40,130,20) ;
 field3.setBounds(350,40,70,20) ;
 scr1.setBounds(20,60,170,170) ;
 scr2.setBounds(205,60,130,170) ;
 scr3.setBounds(350,60,70,150) ;
 scr1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) ;
 scr2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) ;
 scr3.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) ;
 //文本框1
 field1.addKeyListener(new KeyAdapter(){
 public void keyTyped(KeyEvent e){
 int count = 0 ; //文本框中的字符数
 String str = null ; //保存输入到文本框中的字符
 int size = fontList.getModel().getSize() ; //fontList中的文本个数
 str = field1.getText()+e.getKeyChar()+"" ;
 count = str.length() ;
 
 for(int i=0; i=count){
 //判断输入的是否与JList中的内容部分匹配(忽略大小写)
 if(fontList.getModel().getElementAt(i).substring(0, count).compareToIgnoreCase(str)==0){
 fontList.ensureIndexIsVisible(size-i>=10 ? i+9 : size-1);
 if(fontList.getModel().getElementAt(i).compareToIgnoreCase(str)==0){
 fontList.setSelectedIndex(i);
 }
 break ;
 }
 else{
 fontList.ensureIndexIsVisible(0);
 fontList.clearSelection();
 }
 }
 }
 }
 });
 //文本框2
 field2.addKeyListener(new KeyAdapter(){
 public void keyTyped(KeyEvent e){
 int count = 0 ; //文本框中的字符数
 String str = null ; //保存输入到文本框中的字符
 int size = fStyleList.getModel().getSize() ; //fontList中的文本个数
 str = field2.getText()+e.getKeyChar()+"" ;
 count = str.length() ;
 
 for(int i=0; i=count){
 //判断输入的是否与JList中的内容部分匹配(忽略大小写)
 if(fStyleList.getModel().getElementAt(i).substring(0, count).compareToIgnoreCase(str)==0){
 if(fStyleList.getModel().getElementAt(i).compareToIgnoreCase(str)==0){
 fStyleList.setSelectedIndex(i);
 }
 break ;
 }
 else{
 fStyleList.clearSelection();
 }
 }
 }
 }
 });
 //文本框3
 field3.addKeyListener(new KeyAdapter(){
 public void keyTyped(KeyEvent e){
 int count = 0 ; //文本框中的字符数
 String str = null ; //保存输入到文本框中的字符
 int size = fSizeList.getModel().getSize() ; //fontList中的文本个数
 str = field3.getText()+e.getKeyChar()+"" ;
 count = str.length() ;
 
 for(int i=0; i=count){
 //判断输入的是否与JList中的内容部分匹配(忽略大小写)
 if(fSizeList.getModel().getElementAt(i).substring(0, count).compareToIgnoreCase(str)==0){
 fSizeList.ensureIndexIsVisible(size-i>=9 ? i+8 : size-1);
 if(fSizeList.getModel().getElementAt(i).compareToIgnoreCase(str)==0){
 fSizeList.setSelectedIndex(i);
 }
 break ;
 }
 else{
 fSizeList.ensureIndexIsVisible(0);
 fSizeList.clearSelection();
 }
 }
 }
 }
 });
 //设置示例中的文本字体样式
 //设置字形与字号对照表
 final Map map = new HashMap() ;
 map.put("常规", (float) Font.PLAIN) ;
 map.put("倾斜", (float) Font.ITALIC) ;
 map.put("粗体", (float) Font.BOLD) ;
 map.put("倾斜 粗体", (float) (Font.ITALIC+Font.BOLD)) ;
 map.put("初号", 42f) ;
 map.put("小号", 36f) ;
 map.put("1号", 26f) ;
 map.put("小1", 24f) ;
 map.put("2号", 22f) ;
 map.put("小2", 18f) ;
 map.put("3号", 16f) ;
 map.put("小3", 15f) ;
 map.put("4号", 14f) ;
 map.put("小4", 12f) ;
 map.put("5号", 10.5f) ;
 map.put("6号", 7.5f) ;
 map.put("小6", 6.5f) ;
 map.put("7号", 5.5f) ;
 map.put("8号", 5f) ;
 
 //字体列表监听事件
 fontList.addListSelectionListener(new ListSelectionListener(){
 @Override
 public void valueChanged(ListSelectionEvent e) {
 String txtFont = txt.getFont().getName() ; //获取文本中的字体
 selectedFont = fontList.isSelectionEmpty() ? txtFont :fontList.getSelectedValue() ;
 instns.setFont(new Font(selectedFont,selectedStyle,(int)selectedSize));
 }
 }) ;
 //字体样式监听事件
 fStyleList.addListSelectionListener(new ListSelectionListener(){
 @Override
 public void valueChanged(ListSelectionEvent e) {
 int txtStyle = txt.getFont().getStyle() ; //获取文本中的字体
 selectedStyle = (int) (fStyleList.isSelectionEmpty() ? txtStyle :map.get(fStyleList.getSelectedValue())) ;
 instns.setFont(new Font(selectedFont,selectedStyle,(int)selectedSize));
 }
 }) ;
 //字体大小监听
 fSizeList.addListSelectionListener(new ListSelectionListener(){
 public void valueChanged(ListSelectionEvent e){
 int txtSize = txt.getFont().getSize() ;
 if(!fSizeList.isSelectionEmpty()){
 String temp = fSizeList.getSelectedValue() ;
 if(temp.matches("\\d+")){
 selectedSize = Integer.parseInt(temp) ;
 }else{
 selectedSize = map.get(fSizeList.getSelectedValue()) ;
 }
 }
 instns.setFont(new Font(selectedFont,selectedStyle,(int)selectedSize));
 }
 });
 //确定按钮
 okBtn.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 txt.setFont(new Font(selectedFont,selectedStyle,(int)selectedSize));
 isOpen = false ;
 dispose() ;
 }
 });
 //取消按钮
 cancBtn.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 dispose() ;
 isOpen = false ;
 }
 });
 /*class MyRender extends DefaultListCellRenderer{
 public Component getListCellRendererComponent(JList<?> list, Object value, 
 int index, boolean isSelected,
 boolean cellHasFocus){
 String font = value.toString() ;
 setFont(new Font(font,Font.PLAIN,12)) ;
 return this ;
 }
 }*/
 setLayout(null) ;
 add(label1) ;
 add(label2) ;
 add(label3) ;
 add(instns) ;
 add(field1) ;
 add(field2) ;
 add(field3) ;
 add(scr1) ;
 add(scr2) ;
 add(scr3) ;
 add(okBtn) ;
 add(cancBtn) ;
 setModal(true) ; //当对话框弹出时母窗口不可编辑
 setSize(440,530) ;
 setLocation(x/2-220,y/2-265) ;
 setResizable(false) ;
 setVisible(true) ;
 setDefaultCloseOperation(DISPOSE_ON_CLOSE) ;
 addWindowListener(new WindowAdapter(){
 public void windowOpened(WindowEvent e){
 isOpen = true ;
 }
 }) ;
 addWindowListener(new WindowAdapter(){
 public void windowClosing(WindowEvent e){
 isOpen = false ;
 }
 }) ;
 }
 }
 //字体
 font.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 if(!isOpen){
 new FontDialog() ;
 }
 }
 });
 //查看帮助
 checkHelp.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 JOptionPane.showMessageDialog(null, "与Windows系统下的帮助相似", "帮助", JOptionPane.CLOSED_OPTION);
 }
 });
 //关于
 about.addActionListener(new ActionListener(){
 public void actionPerformed(ActionEvent e){
 JOptionPane.showMessageDialog(null, "仿Windows记事本,初学Java的练手作品", "关于", JOptionPane.CLOSED_OPTION);
 }
 });
 //右键弹出菜单内部类
 class popupListener extends MouseAdapter{
 private JPopupMenu popup = null ;
 public popupListener(JPopupMenu popup){
 this.popup = popup ;
 
 }
 public void mouseReleased(MouseEvent e){
 showPopupMenu(e) ;
 }
 public void mouseClicked(MouseEvent e){
 showPopupMenu(e) ;
 }
 private void showPopupMenu(MouseEvent e) {
 if (e.isPopupTrigger()) {
 //右键弹出菜单
 jpm.add(undo) ;
 jpm.add(cut) ;
 jpm.add(copy) ;
 jpm.add(delete) ;
 jpm.add(find) ;
 jpm.add(replace) ;
 jpm.add(goTo) ;
 jpm.add(selectAll) ;
 jpm.add(time) ;
 popup.show(e.getComponent(), e.getX(), e.getY());
 }
 }
 }
 
 //右键弹出菜单
 txt.addMouseListener(new popupListener(jpm)) ;
 //设置快捷键
 newFile.setAccelerator(KeyStroke.getKeyStroke('N',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 open.setAccelerator(KeyStroke.getKeyStroke('O',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 save.setAccelerator(KeyStroke.getKeyStroke('S',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 
 undo.setAccelerator(KeyStroke.getKeyStroke('Z',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 cut.setAccelerator(KeyStroke.getKeyStroke('X',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 copy.setAccelerator(KeyStroke.getKeyStroke('C',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 paste.setAccelerator(KeyStroke.getKeyStroke('V',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 find.setAccelerator(KeyStroke.getKeyStroke('F',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 replace.setAccelerator(KeyStroke.getKeyStroke('H',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 goTo.setAccelerator(KeyStroke.getKeyStroke('G',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 selectAll.setAccelerator(KeyStroke.getKeyStroke('A',java.awt.event.InputEvent.CTRL_DOWN_MASK));
 time.setAccelerator((KeyStroke) KeyStroke.getAWTKeyStroke((char) KeyEvent.VK_F5));
 //设置助记键
 file.setMnemonic('F');
 edit.setMnemonic('E');
 format.setMnemonic('O');
 view.setMnemonic('V');
 help.setMnemonic('H');
 
 newFile.setMnemonic('N');
 open.setMnemonic('O');
 save.setMnemonic('S');
 exit.setMnemonic('X');
 
 undo.setMnemonic('U'); 
 cut.setMnemonic('T'); 
 copy.setMnemonic('C');
 paste.setMnemonic('P'); 
 delete.setMnemonic('L');
 find.setMnemonic('F');
 replace.setMnemonic('R');
 goTo.setMnemonic('G');
 selectAll.setMnemonic('A');
 time.setMnemonic('D');
 
 font.setMnemonic('F');
 autoLineWrap.setMnemonic('W');
 
 state.setMnemonic('S');
 
 checkHelp.setMnemonic('H');
 about.setMnemonic('A');
 
 txt.setFont(new Font("Fixedsys",Font.PLAIN,16));
 txt.setEditable(true);
 
 file.add(newFile) ;
 file.add(open) ;
 file.add(save) ;
 file.addSeparator();
 file.add(exit) ;
 
 edit.add(undo) ;
 edit.addSeparator();
 edit.add(cut) ;
 edit.add(copy) ;
 edit.add(paste) ;
 edit.add(delete) ;
 edit.addSeparator();
 edit.add(find) ;
 edit.add(replace) ;
 edit.add(goTo) ;
 edit.addSeparator();
 edit.add(selectAll) ;
 edit.add(time) ;
 
 format.add(autoLineWrap) ;
 format.add(font) ;
 view.add(state) ;
 help.add(checkHelp) ;
 help.addSeparator();
 help.add(about) ;
 
 mb.add(file) ;
 mb.add(edit) ;
 mb.add(format) ;
 mb.add(view) ;
 mb.add(help) ;
 setJMenuBar(mb) ;
 add(mp) ;
 add(new JScrollPane(txt)) ;
 setVisible(true) ;
 setSize(530,640) ;
 setLocation(x/2-265,y/2-320);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
 }
}

package org.mfy.notepad;
 
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
 
public class Notepad {
 
 public static void main(String[] args) {
 try {
 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 } catch (ClassNotFoundException | InstantiationException
 | IllegalAccessException | UnsupportedLookAndFeelException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 new MyNotepad() ;
 }
 
}

Related articles: