初学Java后第一个作品,请大家多多支持!!!

来源:互联网 发布:免费打电话软件推荐 编辑:程序博客网 时间:2024/06/02 13:23

本程序是一个记事本程序,根据了MVC模式来设计的,不过由于我初学,对MVC的认识还不是很深,所以很多地方做得不够好。
由于不能上传附件,所以在这里粘贴了源代码,请各位兄弟支持下

//EditModel.java
//----------------------------------------------------------------
package sujl.ijedit;

import java.io.*;
import java.awt.Color;
import javax.swing.*;
import javax.swing.undo.*;
import sujl.ijedit.dialog.*;

public class EditModel {
 IJEditFrame ijEditFrame = null;
 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 = null;
 
 public EditModel(IJEditFrame ijEdit) {
  this.ijEditFrame = ijEdit;
 }
 
 public void newFile() {
  int answer = dirtyToHint();
  if (answer == YES || answer == NO) {
   ijEditFrame.textArea.setText("");
   ijEditFrame.setTitle("无标题");
   setFileIsDirty(false);  //由于是新建了一个文件,所以dirty为false
  }
 }
 
 public void openFile() {
  int answer = dirtyToHint();
  if (answer == YES || answer == NO) {
   JFileChooser fileChooser = new JFileChooser();
   int choice = fileChooser.showOpenDialog(ijEditFrame);
   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');
     }
     ijEditFrame.textArea.setText(text.toString());
     ijEditFrame.setTitle(file.getName());
     br.close();
     setFileIsDirty(false);
    } catch (FileNotFoundException fnfe) {
     JOptionPane.showMessageDialog(ijEditFrame, "没有找到该文件", "错误",
                JOptionPane.ERROR_MESSAGE);
    } catch (IOException ioe) {
     JOptionPane.showMessageDialog(ijEditFrame, "读取文件出错", "错误",
                JOptionPane.ERROR_MESSAGE);
    }
   } // end if2
  } // end if1
 } // end method
 
 public boolean saveFile() {
  boolean result = false;
  if (!(file == null)) {
   try {
    FileWriter fw = new FileWriter(file);
    String text = ijEditFrame.textArea.getText();
    fw.write(text);
    fw.flush();
    fw.close();
    result = true;
    setFileIsDirty(false);
   } catch (IOException ioe) {
    JOptionPane.showMessageDialog(ijEditFrame, "保存文件出错", "错误",
                JOptionPane.ERROR_MESSAGE);
    result = false;
   }
  } else {
   saveAsFile();
  }
  return result;
 }
 
 public boolean saveAsFile() {
  boolean result = false;
  JFileChooser fileChooser = new JFileChooser();
  int choice = fileChooser.showSaveDialog(ijEditFrame);
  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 void cutText() {
  ijEditFrame.textArea.cut();
 }
 
 public void copyText() {
  ijEditFrame.textArea.copy();
 }
 
 public void pasteText() {
  ijEditFrame.textArea.paste();
 }
 
 /* 返回这篇文档是否被修改的布尔值,
    true表示被修改过,false表示没有被修改 */
 public boolean getFileIsDirty() {
  return isDirty;
 }
 
 // 设置文档修改的标志位
 public void setFileIsDirty(boolean dirty) {
  this.isDirty = dirty;
 }
 
  /* 检测是否做过修改,如果有,就会出现提问信息框
    1:YES
    2:NO
    3:CANCEL
    -1:ERROR*/
 public int dirtyToHint() {
  int result = ERROR;
  if (getFileIsDirty()) {
   int choice = JOptionPane.showConfirmDialog(ijEditFrame, "文档已经被修改,是否保存?", "IJEdit提示",
            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;
   } // end switch
  } else {
   result = NO;
  }
  return result;
 } //  end method
 
 public void setTextFont() {
  JFontChooser font = new JFontChooser(ijEditFrame, null);
  int answer = font.showDialog();
  if (answer == JFontChooser.APPROVE_OPTION) {
   ijEditFrame.textArea.setFont(font.getFont());
  }
 }
 
 public void setBackgroundColor() {
  Color color = JColorChooser.showDialog(ijEditFrame, "背景颜色", ijEditFrame.textArea.getBackground());
  if (color==null)
   ijEditFrame.textArea.setBackground(Color.white);
  else
   ijEditFrame.textArea.setBackground(color);
 }
 
 public void find() {
  JFindDialog findDlg = new JFindDialog(ijEditFrame, ijEditFrame.textArea);
  findDlg.showFindDialog();
 }
 
 public void replace() {
  JFindDialog findDlg = new JFindDialog(ijEditFrame, ijEditFrame.textArea);
  findDlg.showReplaceDialog();
 }
 
 public void setLineEnter() {
  if (ijEditFrame.itemLine.getText().equals("自动换行")) {
   ijEditFrame.itemLine.setText("不换行");
   ijEditFrame.textArea.setLineWrap(true);
  } else {
   ijEditFrame.itemLine.setText("自动换行");
   ijEditFrame.textArea.setLineWrap(false);
  }
 }
} // end class

//EditController.java
//----------------------------------------------------------------------
package sujl.ijedit;

import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.undo.*;

public class EditController implements ActionListener, DocumentListener, WindowListener,
            UndoableEditListener {
 IJEditFrame frame;
 EditModel model;
 UndoManager um = new UndoManager();
 
 public EditController(IJEditFrame ijFrame) {
  frame = ijFrame;
  model = new EditModel(frame);
 }
 
 //--------  侦听器事件  ----------------//
 public void actionPerformed(ActionEvent e) {
  JMenuItem itemTemp = (JMenuItem)e.getSource();
  if (itemTemp.equals(frame.itemNew)) {
   model.newFile();
  } else if (itemTemp.equals(frame.itemOpen)) {
   model.openFile();
  } else if (itemTemp.equals(frame.itemSave)) {
   model.saveFile();
  } else if (itemTemp.equals(frame.itemSaveAs)) {
   model.saveAsFile();
  } else if (itemTemp.equals(frame.itemExit)) {
   model.exit();
  } else if (itemTemp.equals(frame.itemCut)) {
   model.cutText();
  } else if (itemTemp.equals(frame.itemCopy)) {
   model.copyText();
  } else if (itemTemp.equals(frame.itemPaste)) {
   model.pasteText();
  } else if (itemTemp.equals(frame.itemUndo)) {
   try {
      if (um.canUndo()) {
       um.undo();
      }
     } catch (CannotRedoException ex) {
      System.out.println(ex.getMessage());
     }
  } else if (itemTemp.equals(frame.itemRedo)) {
   try {
      if (um.canRedo()) {
       um.redo();
      }
     } catch (CannotRedoException ex) {
      System.out.println(ex.getMessage());
     }
  } else if (itemTemp.equals(frame.itemFont)) {
   model.setTextFont();
  } else if (itemTemp.equals(frame.itemFind)) {
   model.find();
  } else if (itemTemp.equals(frame.itemReplace)) {
   model.replace();
  } else if (itemTemp.equals(frame.itemBackground)) {
   model.setBackgroundColor();
  } else if (itemTemp.equals(frame.itemLine)) {
   model.setLineEnter();
  }
 }
 
 public void insertUpdate(DocumentEvent e) {
  model.setFileIsDirty(true);
  frame.itemUndo.setText(um.getUndoPresentationName());
  frame.itemRedo.setText(um.getRedoPresentationName());
  setUndoOrRedoMenu();
 }
     
 public void removeUpdate(DocumentEvent e) {
  model.setFileIsDirty(true);
  frame.itemUndo.setText(um.getUndoPresentationName());
  frame.itemRedo.setText(um.getRedoPresentationName());
  setUndoOrRedoMenu();
 }
     
 public void changedUpdate(DocumentEvent e) {
  model.setFileIsDirty(true);
  frame.itemUndo.setText(um.getUndoPresentationName());
  frame.itemRedo.setText(um.getRedoPresentationName());
  setUndoOrRedoMenu();
 }
 
 // 设置是否使Undo/Redo按钮有效
 private void setUndoOrRedoMenu() {
  if (um.canUndo()) {
   frame.itemUndo.setEnabled(true);
  } else {
   frame.itemUndo.setEnabled(false);
  }
  
  if (um.canRedo()) {
   frame.itemRedo.setEnabled(true);
  } else {
   frame.itemRedo.setEnabled(false);
  }
 }
 
 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(); }
 
 public void undoableEditHappened(UndoableEditEvent e) {
  um.addEdit(e.getEdit());
 }
 //------------------------------------------------//
}

//IJEditApp.java
//---------------------------------------------------------------------------------
package sujl.ijedit;

import sujl.ijedit.IJEditFrame;
import java.awt.*;
import javax.swing.UIManager;

public class IJEditApp {
 
 public static void main(String[] args) {
  /*
  try {
   UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
  } catch (Exception e) {
   System.out.println(e.getMessage());
  }*/
  
  IJEditFrame ijFrame = new IJEditFrame();
  ijFrame.setSize(700,600);
  
  //--  set the frame to screen center  --//
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
     Dimension frameSize = ijFrame.getSize();
  if (frameSize.height > screenSize.height) {
       frameSize.height = screenSize.height;
     }
     if (frameSize.width > screenSize.width) {
       frameSize.width = screenSize.width;
     }
     ijFrame.setLocation((screenSize.width - frameSize.width) / 2,
            (screenSize.height - frameSize.height) / 2);
     //-----------------------------------------------//
     
  ijFrame.setVisible(true);
 }
}

//JFindDialog.java
package sujl.ijedit.dialog;

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);
 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);
  this.findArea = findArea;
  
  //--  设置界面  --//
  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);
  Box box1 = Box.createVerticalBox();
  panel01.add(box1);
  box1.add(txtFind);
  box1.createVerticalStrut(20);
  box1.add(txtReplace);
  JPanel panel02 = new JPanel();
  panelCenter.add(panel02);
  Box box2 = Box.createVerticalBox();
  panel02.add(box2);
  box2.add(btnFind);
  box1.createVerticalStrut(10);
  box2.add(btnReplace);
  box1.createVerticalStrut(10);
  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() + "/"",
               "IJEdit提示", JOptionPane.INFORMATION_MESSAGE);
    }
   }
  });
  btnReplace.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (!replace()) {
     JOptionPane.showMessageDialog(null, "找不到/"" + txtFind.getText() + "/"",
               "IJEdit提示", JOptionPane.INFORMATION_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);
  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。 */
  if (btnFindForward.isSelected()) {
   pos = findArea.getSelectionEnd();
  } else if (btnFindBackward.isSelected()) {
   pos = findArea.getSelectionStart()-1;
  }
  
  if (findStrLen == 0) return result;
  try {
   while (pos >= 0 && pos <= findArea.getText().length()) {
    String temp = findArea.getText(pos, findStrLen);
    if (temp.compareTo(findStr)==0) {
     findArea.select(pos, pos + findStrLen);
     result = true;
     break;
    }
    if (btnFindForward.isSelected()) {
     pos++;
    } else if (btnFindBackward.isSelected()) {
     pos--;
    }
   } // end while 
  } catch (BadLocationException ble) {
   result = false;
  }
  return result;
 } // end method
 
 protected boolean replace() {
  boolean result = false;
  String replaceStr = txtReplace.getText();
  if (find() && replaceStr.length()>0) {
   findArea.replaceSelection(replaceStr);
   result = true;
  }
  return result;
 }
}

//IJEditFrame.java
//----------------------------------------------------------------
package sujl.ijedit;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;

public class IJEditFrame extends JFrame {
 JPanel panelMain = new JPanel();
 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 menuSearch = new JMenu("搜索");
 JMenu menuFormat = new JMenu("风格");
 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 itemRedo = new JMenuItem("重做");
 JMenuItem itemCut = new JMenuItem("剪切");
 JMenuItem itemCopy = new JMenuItem("复制");
 JMenuItem itemPaste = new JMenuItem("粘贴");
 JMenuItem itemFont = new JMenuItem("字体");
 JMenuItem itemBackground = new JMenuItem("背景");
 JMenuItem itemLine = new JMenuItem("自动换行");
 JMenuItem itemFind = new JMenuItem("查找");
 JMenuItem itemReplace = new JMenuItem("替换");
 //---------------------------------------//
 
 public IJEditFrame() {
  super("无标题");
  this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  this.setJMenuBar(menuBar);
  
  panelMain = (JPanel)this.getContentPane();
  panelMain.add(scrollPane); 
  document = (Document)textArea.getDocument();
  // 默认为不换行
  textArea.setLineWrap(false);
  textArea.setWrapStyleWord(true);   
  
  //-- 设置菜单 --//
  itemUndo.setEnabled(false);
  itemRedo.setEnabled(false);
  
  menuBar.add(menuFile);
  menuBar.add(menuEdit);
  menuBar.add(menuSearch);
  menuBar.add(menuFormat);
  
  menuFile.add(itemNew);
  menuFile.add(itemOpen);
  menuFile.add(itemSave);
  menuFile.add(itemSaveAs);
  menuFile.addSeparator();
  menuFile.add(itemExit);
  
  menuEdit.add(itemUndo);
  menuEdit.add(itemRedo);
  menuEdit.addSeparator();
  menuEdit.add(itemCut);
  menuEdit.add(itemCopy);
  menuEdit.add(itemPaste);
  
  menuSearch.add(itemFind);
  menuSearch.add(itemReplace);
  
  menuFormat.add(itemLine);
  menuFormat.addSeparator();
  menuFormat.add(itemFont);
  menuFormat.add(itemBackground);
  //----------------------------//
  
  //-- 增加菜单的侦听者 --//
  controller = new EditController(this);
  itemNew.addActionListener(controller);
  itemOpen.addActionListener(controller);
  itemSave.addActionListener(controller);
  itemSaveAs.addActionListener(controller);
  itemExit.addActionListener(controller);
  itemUndo.addActionListener(controller);
  itemRedo.addActionListener(controller);
  itemCut.addActionListener(controller);
  itemCopy.addActionListener(controller);
  itemPaste.addActionListener(controller);
  itemFont.addActionListener(controller);
  itemBackground.addActionListener(controller);
  itemFind.addActionListener(controller);
  itemReplace.addActionListener(controller);
  itemLine.addActionListener(controller);
  //--------------------------//
  
  document.addDocumentListener(controller);
  document.addUndoableEditListener(controller);
  this.addWindowListener(controller); 
  
  this.pack();  
 } // end create method 
} // end class

//JFontChooser.java
//----------------------------------------------------------------------
package sujl.ijedit.dialog;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JFontChooser extends JDialog {
 Font selectFont;
 JPanel panel;
 JList fontNameList;
 JList fontSizeList;
 JButton btnApprove = new JButton("确定");
 JButton btnCancel = new JButton("取消");
 JCheckBox boxBold = new JCheckBox("粗体");
 JCheckBox boxItalic = new JCheckBox("斜体");
 JLabel viewFont = new JLabel("Example");
 public static final int APPROVE_OPTION = 1;
 public static final int CANCEL_OPTION = 2;
 int option = 0;
 
 public JFontChooser() {
  this(null, null);
 }
 
 public JFontChooser(JFrame owner, Font initFont) {
  super(owner, "字体", true); 
  
  //------------- 设置字体选择对话框的界面 ---------------//
  viewFont.setHorizontalAlignment(JLabel.CENTER);
  String[] fontName = GraphicsEnvironment.getLocalGraphicsEnvironment().
          getAvailableFontFamilyNames();
  fontNameList = new JList(fontName);
  JScrollPane scrollPane1 = new JScrollPane(fontNameList);
  
  String[] fontSize = {"8      ", "10", "12", "14", "16",
      "18", "20", "24", "30", "36", "40",
      "48", "60", "72"};
  fontSizeList = new JList(fontSize);
  JScrollPane scrollPane2 = new JScrollPane(fontSizeList);
  
  panel = (JPanel)this.getContentPane();
  panel.setLayout(new BorderLayout());
  JPanel panelCenter = new JPanel();
  JPanel panelBottom = new JPanel(new GridLayout(2, 1));
  panel.add(panelCenter, BorderLayout.CENTER);
  panel.add(panelBottom, BorderLayout.SOUTH);
  
  JPanel panel1 = new JPanel();
  JPanel panel2 = new JPanel();
  panel1.add(viewFont);
  panel2.add(btnApprove);
  panel2.add(btnCancel);
  panelBottom.add(panel1);
  panelBottom.add(panel2);
  panelCenter.add(scrollPane1);
  panelCenter.add(scrollPane2);
  JPanel panel3 = new JPanel(new GridLayout(5, 1));
  panel3.add(boxBold);
  panel3.add(boxItalic);
  panelCenter.add(panel3);
  //--------------------------------------//
  
  fontNameList.addListSelectionListener(new ListSelectionListener() {
   public void valueChanged(ListSelectionEvent e) {
    previewFont();
   }
  });
  fontSizeList.addListSelectionListener(new ListSelectionListener() {
   public void valueChanged(ListSelectionEvent e) {
    previewFont();
   }
  });
  boxBold.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    previewFont();
   }
  });
  boxItalic.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    previewFont();
   }
  });
  btnApprove.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    option = APPROVE_OPTION;
    close();
   }
  });
  
  btnCancel.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    option = CANCEL_OPTION;
    close();
   }
  });
  
  //----------- 设置初始化窗口的字体参数 --------//
  if (initFont == null) {
   fontNameList.setSelectedIndex(0);
   fontSizeList.setSelectedIndex(4);
  } else {
   
  }
  //--------------------------------------------//
  
  this.pack();
  this.setLocationRelativeTo(owner);
 }
 
  
 private void previewFont() {
  String selectFontName = null;
  Font tempFont = null;
  int selectSize = 8;
  if (!fontNameList.isSelectionEmpty()) {
   selectFontName = fontNameList.getSelectedValue().toString();
  }
  if (!fontSizeList.isSelectionEmpty()) {
   String temp = fontSizeList.getSelectedValue().toString().trim();
   selectSize = Integer.parseInt(temp);
  }  
  boolean isBold = boxBold.isSelected();
  boolean isItalic = boxItalic.isSelected();
  int attr = Font.PLAIN;
  if (isBold) attr = Font.BOLD;
  if (isItalic) attr |= Font.ITALIC;
  tempFont = new Font(selectFontName, attr, selectSize);
  viewFont.setFont(tempFont);
 }
 
 private void applyFont() {
  selectFont = viewFont.getFont();
 }
 
 public Font getFont() {
  return selectFont;
 }
 
 private void close() {
  switch (option) {
   case APPROVE_OPTION:
    applyFont();
    break;
   case CANCEL_OPTION:
   default:
    selectFont = null;
    break;    
  }
  this.dispose();
 }
 
 public int showDialog() {
  this.setVisible(true);
  return option;
 }
}

原创粉丝点击