import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.text.*;import javax.swing.event.*;public class IJMFrame extends JFrame {Document document = null;JTextArea textArea = new JTextArea();JScrollPane scrollPane = new JScrollPane(textArea); EditController controller;//------ 定义菜单变量------//JMenuBar menuBar = new JMenuBar();JMenu menuFile = new JMenu("文件");JMenu menuEdit = new JMenu("编辑");JMenu menuFormat = new JMenu("格式"); JPopupMenu memuPopup = new JPopupMenu(); JMenuItem itemNew = new JMenuItem("新建"); JMenuItem itemOpen = new JMenuItem("打开"); JMenuItem itemSave = new JMenuItem("保存"); JMenuItem itemSaveAs = new JMenuItem("另存"); JMenuItem itemExit = new JMenuItem("退出"); JMenuItem itemUndo = new JMenuItem("撤消"); JMenuItem itemCut = new JMenuItem("剪切"); JMenuItem itemCopy = new JMenuItem("复制"); JMenuItem itemPaste = new JMenuItem("粘贴"); JMenuItem itemDelete = new JMenuItem("删除"); JMenuItem itemFind = new JMenuItem("查找"); JMenuItem itemReplace = new JMenuItem("替换"); JMenuItem itemSelectAll = new JMenuItem("全选"); JMenuItem itemFont = new JMenuItem("字体");//------------定义右键菜单------------------------// JMenuItem popupMenu_Undo=new JMenuItem("撤销"); JMenuItem popupMenu_Cut=new JMenuItem("剪切"); JMenuItem popupMenu_Copy=new JMenuItem("复制"); JMenuItem popupMenu_Paste=new JMenuItem("粘贴"); JMenuItem popupMenu_Delete=new JMenuItem("删除"); JMenuItem popupMenu_SelectAll=new JMenuItem("全选");public IJMFrame() {super("记事本");setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setJMenuBar(menuBar);//创建新的菜单栏getContentPane().add(scrollPane);document = textArea.getDocument();textArea.setLineWrap(true);// 默认为换行textArea.setWrapStyleWord(true);//-- 设置菜单--//itemUndo.setEnabled(false);menuBar.add(menuFile);menuBar.add(menuEdit);menuBar.add(menuFormat);menuFile.add(itemNew);menuFile.add(itemOpen);menuFile.add(itemSave);menuFile.add(itemSaveAs);menuFile.addSeparator();menuFile.add(itemExit);menuEdit.add(itemUndo);menuEdit.addSeparator();menuEdit.add(itemCut);menuEdit.add(itemCopy);menuEdit.add(itemPaste);menuEdit.add(itemDelete);menuEdit.addSeparator();menuEdit.add(itemFind);menuEdit.add(itemReplace);menuEdit.add(itemSelectAll);menuFormat.add(itemFont);popupMenu_Undo.setEnabled(false); // 撤消选项初始设为不可用memuPopup.add(popupMenu_Undo);memuPopup.addSeparator();memuPopup.add(popupMenu_Cut);memuPopup.add(popupMenu_Copy);memuPopup.add(popupMenu_Paste);memuPopup.add(popupMenu_Delete);memuPopup.addSeparator();memuPopup.add(popupMenu_SelectAll);//-- 增加菜单的侦听者--//controller = new EditController(this);itemNew.addActionListener(controller);itemOpen.addActionListener(controller);itemSave.addActionListener(controller);itemSaveAs.addActionListener(controller);itemExit.addActionListener(controller);itemUndo.addActionListener(controller);itemCut.addActionListener(controller);itemCopy.addActionListener(controller);itemPaste.addActionListener(controller);itemDelete.addActionListener(controller);itemFind.addActionListener(controller);itemReplace.addActionListener(controller);itemSelectAll.addActionListener(controller);itemFont.addActionListener(controller);popupMenu_Undo.addActionListener(controller);popupMenu_Cut.addActionListener(controller);popupMenu_Copy.addActionListener(controller);popupMenu_Paste.addActionListener(controller);popupMenu_Delete.addActionListener(controller);popupMenu_SelectAll.addActionListener(controller);document.addDocumentListener(controller);document.addUndoableEditListener(controller);addWindowListener(controller);MouseAdapter mAdapter=new MouseAdapter(){public void mousePressed(MouseEvent e) {checkForTriggerEvent(e);}public void mouseReleased(MouseEvent e) {checkForTriggerEvent(e);}private void checkForTriggerEvent(MouseEvent e) {if (e.isPopupTrigger())memuPopup.show(e.getComponent(), e.getX(), e.getY());// 在组件调用者的坐标空间中的位置// X、Y// 显示弹出菜单。
}};textArea.addMouseListener(mAdapter);setSize(600,600);setVisible(true);}public static void main(String[] args) {new IJMFrame();}}import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.undo.*;public class EditController implements ActionListener, DocumentListener, WindowListener, UndoableEditListener {IJMFrame frame;EditModel model;UndoManager um = new UndoManager();public EditController(IJMFrame ijFrame) {frame = ijFrame;model = new EditModel(frame);}//-------- 侦听器事件----------------//public void actionPerformed(ActionEvent e) {if (e.getSource()==frame.itemNew) {model.newFile();} else if (e.getSource()==frame.itemOpen) {model.openFile();} else if (e.getSource()==frame.itemSave) {model.saveFile();} else if (e.getSource()==frame.itemSaveAs) {model.saveAsFile();} else if (e.getSource()==frame.itemExit) {model.exit();} else if (e.getSource()==frame.itemPaste||e.getSource()==frame.popupMenu_Paste) { frame.textArea.paste();}else if (e.getSource()==frame.itemDelete||e.getSource()==frame.popupMenu_Delete) { frame.textArea.requestFocus();frame.textArea.replaceRange("", frame.textArea.getSelectionStart(), frame.textArea.getSelectionEnd());}else if (e.getSource()==frame.itemSelectAll||e.getSource()==frame.popupMenu_SelectAll) { frame.textArea.selectAll();} else if (e.getSource()==frame.itemFont) {model.setTextFont();} else if (e.getSource()==frame.itemFind) {model.find();} else if (e.getSource()==frame.itemReplace) {model.replace();} else if (e.getSource()==frame.itemCut||e.getSource()==frame.popupMenu_Cut) {frame.textArea.cut();} else if (e.getSource()==frame.itemCopy||e.getSource()==frame.popupMenu_Copy) {frame.textArea.copy();} else if (e.getSource()==frame.itemUndo||e.getSource()==frame.popupMenu_Undo) {try {if (um.canUndo()) {um.undo();}} catch (CannotUndoException ex) {}}}public void insertUpdate(DocumentEvent e) {model.setFileIsDirty(true);setUndoMenu();}public void removeUpdate(DocumentEvent e) {model.setFileIsDirty(true);setUndoMenu();}public void changedUpdate(DocumentEvent e) {model.setFileIsDirty(true);setUndoMenu();}// 设置是否使Undo按钮有效private void setUndoMenu() {if (um.canUndo()) {frame.itemUndo.setEnabled(true);frame.popupMenu_Undo.setEnabled(true);} else {frame.itemUndo.setEnabled(false);frame.popupMenu_Undo.setEnabled(false);}}public void undoableEditHappened(UndoableEditEvent e) {um.addEdit(e.getEdit());}public void windowOpened(WindowEvent e) {}public void windowClosed(WindowEvent e) {}public void windowIconified(WindowEvent e) {}public void windowDeiconified(WindowEvent e) {}public void windowActivated(WindowEvent e) {}public void windowDeactivated(WindowEvent e) {}public void windowClosing(WindowEvent e) { model.exit(); }}import java.io.*;import javax.swing.*;public class EditModel {IJMFrame ijMFrame;private boolean isDirty = false;private static final int YES = 1;private static final int NO =2;private static final int CANCEL = 3;private static final int ERROR = -1;File file ;public EditModel(IJMFrame ijEdit) {this.ijMFrame = ijEdit;{try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (UnsupportedLookAndFeelException e) {e.printStackTrace();}}}public void newFile() {int answer = DirtyToHint();if (answer == YES || answer == NO) {ijMFrame.textArea.setText("");ijMFrame.setTitle("无标题");setFileIsDirty(false);}}public void openFile() {int answer = DirtyToHint();if (answer == YES || answer == NO) {JFileChooser fileChooser = new JFileChooser();int choice = fileChooser.showOpenDialog(ijMFrame);if (choice == JFileChooser.APPROVE_OPTION) {file = fileChooser.getSelectedFile();try {BufferedReader br = new BufferedReader(new FileReader(file));String temp = null;StringBuffer text = new StringBuffer();while (!((temp = br.readLine()) == null)) {text.append(temp);text.append('\n');}ijMFrame.textArea.setText(text.toString());ijMFrame.setTitle(file.getName());br.close();setFileIsDirty(false);} catch (FileNotFoundException fnfe) {JOptionPane.showMessageDialog(ijMFrame, "没有找到该文件", "错误",JOptionPane.ERROR_MESSAGE);} catch (IOException ioe) {JOptionPane.showMessageDialog(ijMFrame, "读取文件出错", "错误",JOptionPane.ERROR_MESSAGE);}}}}public boolean saveFile() {boolean result = false;if (!(file == null)) {try {FileWriter fw = new FileWriter(file);String text = ijMFrame.textArea.getText();fw.write(text);fw.flush();fw.close();result = true;setFileIsDirty(false);} catch (IOException ioe) {JOptionPane.showMessageDialog(ijMFrame, "保存文件出错", "错误",JOptionPane.ERROR_MESSAGE);result = false;}} else {saveAsFile();}return result;}public boolean saveAsFile() {boolean result = false;JFileChooser fileChooser = new JFileChooser();int choice = fileChooser.showSaveDialog(ijMFrame);if (choice == JFileChooser.APPROVE_OPTION) {file = fileChooser.getSelectedFile();result = saveFile();}return result;}public void exit() {int answer;answer = DirtyToHint();if ((answer == YES) || (answer == NO)) {System.exit(0);} else if (answer == ERROR) {System.err.println("发生错误");}}//返回文档是否被修改的布尔值public boolean getFileIsDirty() {return isDirty;}public void setFileIsDirty(boolean Dirty) {this.isDirty = Dirty;}//检测是否做过修改public int DirtyToHint() {int result = ERROR;if (getFileIsDirty()) {int choice = JOptionPane.showConfirmDialog(ijMFrame, "文档已经被修改,是否保存?", "提示",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);switch (choice) {case JOptionPane.YES_OPTION:if (saveFile()) {result = YES;} else {result =CANCEL;}break;case JOptionPane.NO_OPTION:result = NO;break;default:result =CANCEL;break;}} else {result = NO;}return result;}public void setTextFont() {JFontChooser font = new JFontChooser(ijMFrame, null);int answer = font.showDialog();if (answer == JFontChooser.APPROVE_OPTION) {ijMFrame.textArea.setFont(font.getFont());}}public void find() {JFindDialog findDlg = new JFindDialog(ijMFrame, ijMFrame.textArea);findDlg.showFindDialog();}public void replace() {JFindDialog findDlg = new JFindDialog(ijMFrame, ijMFrame.textArea);findDlg.showReplaceDialog();}}import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.text.BadLocationException;public class JFindDialog extends JDialog {JPanel panel;JButton btnFind = new JButton("查找");JButton btnReplace = new JButton("替换");JButton btnCancel = new JButton("关闭");JTextField txtFind = new JTextField(20);JTextField txtReplace = new JTextField(20);JLabel lab1=new JLabel("查找:");JLabel lab2=new JLabel("替换:");JRadioButton btnFindForward = new JRadioButton("向下查找", true); JRadioButton btnFindBackward = new JRadioButton("向上查找", false); ButtonGroup btnGroup = new ButtonGroup();JTextArea findArea;public JFindDialog(JFrame owner, JTextArea findArea) {super(owner, "查找和替换", true);//-- 设置界面--//panel = (JPanel)this.getContentPane();JPanel panelCenter = new JPanel();JPanel panelBottom = new JPanel();panel.add(panelCenter, BorderLayout.CENTER);panel.add(panelBottom, BorderLayout.SOUTH);JPanel panel01 = new JPanel();panelCenter.add(panel01);JPanel pan1=new JPanel();JPanel pan2=new JPanel();pan1.add(lab1);pan1.add(txtFind);pan2.add(lab2);pan2.add(txtReplace);panel01.add(pan1, BorderLayout.NORTH);panel01.add(pan2, BorderLayout.SOUTH);panel01.setLayout(new GridLayout(2,1));JPanel panel02 = new JPanel();panelCenter.add(panel02);Box box2 = Box.createV erticalBox();panel02.add(box2);box2.add(btnFind);box2.add(btnReplace);box2.add(btnCancel);panelBottom.add(btnFindForward);panelBottom.add(btnFindBackward);btnGroup.add(btnFindForward);btnGroup.add(btnFindBackward);this.getRootPane().setDefaultButton(btnFind);//------------------------//btnFind.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (!find()) {JOptionPane.showMessageDialog(null, "找不到\"" + txtFind.getText() + "\"","提示", RMA TION_MESSAGE);}}});btnReplace.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (!replace()) {JOptionPane.showMessageDialog(null, "找不到\"" + txtFind.getText() + "\"", "提示", RMA TION_MESSAGE);}}});btnCancel.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {close();}});this.pack();this.setLocationRelativeTo(owner);}public void showFindDialog() {btnReplace.setVisible(false);txtReplace.setVisible(false);lab2.setVisible(false);this.setVisible(true);}public void showReplaceDialog() {btnReplace.setVisible(true);txtReplace.setVisible(true);this.setVisible(true);}private void close() {this.dispose();}protected boolean find() {boolean result = false;String findStr = txtFind.getText();int findStrLen = findStr.length();int pos = 0;/* 如果是向下查找,查找起点就是SelectionEnd;如果是向上查找,查找起点就是SelectionStart - 1。