本程序是一个记事本程序,根据了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;
}
}