📄 myeditor.java
字号:
//记事本
//12/2/2003
//author WuFeng Donghua University
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.undo.*;
public class MyEditor extends JFrame
implements ActionListener,
CaretListener,
DocumentListener,
KeyListener {
JFrame fr; //main frame
JMenuItem menuFileNew, menuFileOpen, menuFileClose,
menuFileSave, menuFileSaveAs,
menuFilePrint, menuFilePrintSetup,
menuFileExit,
menuEditUndo,
menuEditCut, menuEditCopy, menuEditPaste,
menuEditDeleteSelection, menuEditDeleteLine, menuEditDeleteWord,
menuEditFind, menuEditReplace, menuEditGoTo, menuEditSelectAll,menuTime,
menuViewFont, menuViewColor,
menuHelpAbout;
JCheckBoxMenuItem menuViewClassic,menuAuto,menuViewStatus;
PrintableTextArea ta;
Label statusFile, statusRow, statusCol;
String fns; //file name
Color defaultForeground, defaultBackground, defaultCaretColor;
Font defaultFont = new Font("Courier", Font.PLAIN,12);
UndoManager undo = new UndoManager();
UndoableEditListener undoHandler = new UndoHandler();
static int foundCount = 0;
int FindStartPos = 0;
boolean findingLoop = true;
boolean beginTextListener = true, isNewFile;
boolean INSERTMODE = true;
boolean BACKSPACE = false;
public static void main(String[] args){
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
}
Locale.setDefault(Locale.ENGLISH);
MyEditor me = new MyEditor();
//***************** accept parameter here *************//
if(args.length > 0)
me.windowLayout(args[0]);
else
me.windowLayout(null);
}
//public void windowLayout() {
public void windowLayout(String tempFns) {
fr = new JFrame("记事本");
fr.getContentPane().setLayout(new BorderLayout(5, 5));
JPanel p = new JPanel();
statusRow = new Label("行数: ");
statusCol = new Label("列数: ");
ta = new PrintableTextArea(20, 50);
ta.setCursor(new Cursor(Cursor.HAND_CURSOR));
ta.setFont(defaultFont);
defaultForeground = ta.getForeground();
defaultBackground = ta.getBackground();
defaultCaretColor = ta.getCaretColor();
ta.getDocument().addDocumentListener(this);
ta.addCaretListener(this);
ta.addKeyListener(this);
ta.getDocument().addUndoableEditListener(undoHandler);
JScrollPane scroller = new JScrollPane();
JViewport port = scroller.getViewport();
port.add(ta);
fr.getContentPane().add("Center", scroller);
fr.getContentPane().add("South", p);
p.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
p.add(statusRow);
p.add(statusCol);
JMenuBar mb = new JMenuBar();
JMenu menuFile = new JMenu("",true);
menuFileNew = new JMenuItem("新建", 'N');
menuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
menuFileNew.addActionListener(this);
menuFileOpen = new JMenuItem("打开...", 'O');
menuFileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
menuFileOpen.addActionListener(this);
menuFileClose = new JMenuItem("关闭", 'C');
menuFileClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.CTRL_MASK));
menuFileClose.addActionListener(this);
menuFileSave = new JMenuItem("保存", 'S');
menuFileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
menuFileSave.addActionListener(this);
menuFileSaveAs = new JMenuItem("另存为...", 'A');
menuFileSaveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0));
menuFileSaveAs.addActionListener(this);
menuFilePrint = new JMenuItem("打印", 'P');
menuFilePrint.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
menuFilePrint.addActionListener(this);
menuFilePrintSetup = new JMenuItem("页面设置...", 'u');
menuFilePrintSetup.addActionListener(this);
menuFilePrintSetup.setEnabled(false);
menuFileExit = new JMenuItem("退出", 'x');
menuFileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_MASK));
menuFileExit.addActionListener(this);
JMenu menuEdit = new JMenu("编辑", true);
menuEditUndo = new JMenuItem("撤消", 'U');
menuEditUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
menuEditUndo.addActionListener(this);
menuEditUndo.setEnabled(false);
menuEditCut = new JMenuItem("剪切", 't');
menuEditCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
menuEditCut.addActionListener(this);
menuEditCopy = new JMenuItem("复制", 'C');
menuEditCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
menuEditCopy.addActionListener(this);
menuEditPaste = new JMenuItem("粘贴", 'P');
menuEditPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
menuEditPaste.addActionListener(this);
JMenu menuEditDelete = new JMenu("删除");
menuEditDelete.setMnemonic('D');
menuEditDeleteSelection = new JMenuItem("选择", 'S');
menuEditDeleteSelection.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
menuEditDeleteSelection.addActionListener(this);
menuEditDeleteLine = new JMenuItem("行", 'L');
menuEditDeleteLine.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
menuEditDeleteLine.addActionListener(this);
menuEditDeleteWord = new JMenuItem("字符", 'W');
menuEditDeleteWord.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK));
menuEditDeleteWord.addActionListener(this);
menuEditFind = new JMenuItem("查找...", 'F');
menuEditFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
menuEditFind.addActionListener(this);
menuEditReplace = new JMenuItem("替换...", 'R');
menuEditReplace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
menuEditReplace.addActionListener(this);
menuEditGoTo = new JMenuItem("转到...", 'G');
menuEditGoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
menuEditGoTo.addActionListener(this);
menuEditSelectAll = new JMenuItem("全选", 'A');
menuEditSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
menuEditSelectAll.addActionListener(this);
menuTime = new JMenuItem("时间/日期");
menuTime.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
menuTime.addActionListener(this);
JMenu menuformat=new JMenu("格式",true);
menuAuto= new JCheckBoxMenuItem("自动换行");
menuAuto.setMnemonic('w');
menuAuto.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuAuto.setState(true);
menuAuto.addActionListener(this);
menuViewFont = new JMenuItem("字体...", 'F');
menuViewFont.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewFont.addActionListener(this);
menuViewColor = new JMenuItem("颜色...", 'C');
menuViewColor.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewColor.addActionListener(this);
JMenu menuView = new JMenu("查看", true);
menuViewClassic = new JCheckBoxMenuItem("经典");
menuViewClassic.setMnemonic('l');
menuViewClassic.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewClassic.setState(false);
menuViewClassic.addActionListener(this);
menuViewStatus = new JCheckBoxMenuItem("状态");
menuViewStatus.setMnemonic('S');
menuViewStatus.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewStatus.setState(true);
menuViewStatus.addActionListener(this);
JMenu menuHelp = new JMenu("帮助", true);
menuHelpAbout = new JMenuItem("关于记事本", 'A');
menuHelpAbout.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
menuHelpAbout.addActionListener(this);
fr.setJMenuBar(mb);
mb.add(menuFile);
menuFile.add(menuFileNew);
menuFile.add(menuFileOpen);
menuFile.add(menuFileClose);
menuFile.addSeparator();
menuFile.add(menuFileSave);
menuFile.add(menuFileSaveAs);
menuFile.addSeparator();
menuFile.add(menuFilePrint);
menuFile.add(menuFilePrintSetup);
menuFile.addSeparator();
menuFile.add(menuFileExit);
mb.add(menuEdit);
menuEdit.add(menuEditUndo);
menuEdit.addSeparator();
menuEdit.add(menuEditCut);
menuEdit.add(menuEditCopy);
menuEdit.add(menuEditPaste);
menuEdit.add(menuEditDelete);
menuEditDelete.add(menuEditDeleteSelection);
menuEditDelete.add(menuEditDeleteLine);
menuEditDelete.add(menuEditDeleteWord);
menuEdit.addSeparator();
menuEdit.add(menuEditFind);
menuEdit.add(menuEditReplace);
menuEdit.add(menuEditGoTo);
menuEdit.addSeparator();
menuEdit.add(menuEditSelectAll);
menuEdit.add(menuTime);
mb.add(menuformat);
menuformat.add(menuAuto);
menuformat.add(menuViewFont);
menuformat.add(menuViewColor);
mb.add(menuView);
menuView.add(menuViewClassic);
menuView.add(menuViewStatus);
menuView.addSeparator();
mb.add(menuHelp);
menuHelp.add(menuHelpAbout);
fr.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if(statusFile.getText().endsWith("*")) {
int option = JOptionPane.showConfirmDialog(null,
"想保存文件吗 ?", "文件已经被改变!", JOptionPane.YES_NO_OPTION);
switch(option) {
case JOptionPane.NO_OPTION :
System.exit(0);
break;
case JOptionPane.YES_OPTION :
if(fns == null) {
if(saveNewFile()) {
System.exit(0);
}
}
else {
if(saveFile()) {
System.exit(0);
}
}
break;
default:
break;
}
}
else {
System.exit(0);
}
}
});
fr.setSize(600,420);
fr.setVisible(true);
if(tempFns != null)
openFileViaArgs(tempFns);
}
//ActionListener
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == menuFileNew) {
if(statusFile.getText().endsWith("*")) {
int option = JOptionPane.showConfirmDialog(null, "想保存文件吗 ?");
if(fns == null) {
switch(option) {
case JOptionPane.NO_OPTION :
setNewFile();
break;
case JOptionPane.YES_OPTION :
if(saveNewFile())
setNewFile();
break;
default:
break;
}
}
else {
switch(option) {
case JOptionPane.NO_OPTION :
setNewFile();
break;
case JOptionPane.YES_OPTION :
if(saveFile())
setNewFile();
break;
default:
break;
}
}
}
else {
setNewFile();
}
}
else if(ae.getSource() == menuFileOpen) {
if(statusFile.getText().endsWith("*")) {
int option = JOptionPane.showConfirmDialog(null, "想保留文件吗 ?");
if(fns == null) {
switch(option) {
case JOptionPane.NO_OPTION :
openFile();
break;
case JOptionPane.YES_OPTION :
if(saveNewFile()) {
openFile();
}
break;
default:
break;
}
}
else {
switch(option) {
case JOptionPane.NO_OPTION :
openFile();
break;
case JOptionPane.YES_OPTION :
if(saveFile()) {
openFile();
}
break;
default:
break;
}
}
}
else {
openFile();
}
}
else if(ae.getSource() == menuFileClose) {
if(statusFile.getText().endsWith("*")) {
int option = JOptionPane.showConfirmDialog(null, "想保留文件吗 ?");
switch(option) {
case JOptionPane.NO_OPTION :
setNewFile();
break;
case JOptionPane.YES_OPTION :
if(fns != null) {
if(saveFile()) {
setNewFile();
}
}
else {
if(saveNewFile()) {
setNewFile();
}
}
break;
default:
break;
}
}
else {
setNewFile();
}
}
else if(ae.getSource() == menuFilePrint) {
JOptionPane.showMessageDialog(null, "请连接好打印机!", "打印", JOptionPane.INFORMATION_MESSAGE);
ta.printIt(ta.getText(), ta.getFont());
}
else if(ae.getSource() == menuFileSave) {
if(fns != null) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -