📄 minieditor.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.undo.*;
public class MiniEditor extends JFrame implements ActionListener,
CaretListener,
DocumentListener,
KeyListener
{
JMenuItem menuFileNew, menuFileOpen, menuFileClose,menuFileSave, menuFileSaveAs,menuFilePrint, menuFilePrintSetup,menuFileExit,
menuEditUndo, menuEditRedo,menuEditCut, menuEditCopy, menuEditPaste,menuEditDeleteSelection, menuEditDeleteLine, menuEditDeleteWord,
menuEditFind, menuEditReplace, menuEditGoTo, menuEditSelectAll,
menuViewFont, menuViewColor,menuViewDoubleSpace,
menuHelpAbout;
JCheckBoxMenuItem menuViewClassic, menuViewStatus, menuViewWordWrap;
PrintableTextArea ta;
TextField tfs, tfro, tfrn;
Label fileStatus, statusRow, statusCol, statusMode, statusSize;
Button bs, brf, brr, brra;
JFrame fr;
JDialog dl;
String fns;
Color defaultForeground, defaultBackground, defaultCaretColor;
Font defaultFont = new Font("Courier", Font.PLAIN,12);
Checkbox dsLoop, dsMatchCase, drMatchCase;
JLabel dsMessage2;
protected UndoManager undo = new UndoManager();
protected UndoableEditListener undoHandler = new UndoHandler();
static int foundCount = 0;
int FindStartPos = 0;
boolean findingLoop = true;
boolean beginTextListener, isNewFile;
boolean INSERTMODE = true;
boolean BACKSPACE = false;
public static void main(String[] args){
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
}
//Locale.setDefault(Locale.CHINA);
//Locale.setDefault(new Locale("zh", "CN"));
MiniEditor me = new MiniEditor();
me.windowLayout();
}
public void windowLayout(){
JFrame fr = new JFrame("MiniEditor");
fr.getContentPane().setLayout(new BorderLayout(5, 5));
JPanel p = new JPanel();
fileStatus = new Label("file status: ");
statusRow = new Label("row: ");
statusCol = new Label("col: ");
statusMode = new Label("mode: ");
statusSize = new Label("size: ");
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.setWrapStyleWord(true);
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, 0));
p.add(fileStatus);
p.add(statusRow);
p.add(statusCol);
p.add(statusMode);
p.add(statusSize);
JMenuBar mb = new JMenuBar();
JMenu menuFile = new JMenu("File", true);
//menuFile.setMnemonic(′F′);
menuFileNew = new JMenuItem("New", ′N′);
menuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
menuFileNew.addActionListener(this);
menuFileOpen = new JMenuItem("Open...", ′O′);
menuFileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
menuFileOpen.addActionListener(this);
menuFileClose = new JMenuItem("Close", ′C′);
menuFileClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.CTRL_MASK));
menuFileClose.addActionListener(this);
menuFileSave = new JMenuItem("Save", ′S′);
menuFileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
menuFileSave.addActionListener(this);
menuFileSaveAs = new JMenuItem("Save As...", ′A′);
menuFileSaveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0));
menuFileSaveAs.addActionListener(this);
menuFilePrint = new JMenuItem("Print", ′P′);
menuFilePrint.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
menuFilePrint.addActionListener(this);
//menuFilePrint.setEnabled(false);
//menuFilePrintSetup = new JMenuItem("Print Setup...");
//menuFilePrintSetup.addActionListener(this);
//menuFilePrintSetup.setMnemonic(′u′);
//menuFilePrintSetup.setEnabled(false);
menuFileExit = new JMenuItem("Exit", ′x′);
menuFileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
menuFileExit.addActionListener(this);
JMenu menuEdit = new JMenu("Edit", true);
menuEditUndo = new JMenuItem("Undo");
menuEditUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
menuEditUndo.addActionListener(this);
menuEditUndo.setEnabled(false);
//menuEditRedo = new JMenuItem("Redo");
//menuEditRedo.addActionListener(this);
//menuEditRedo.setEnabled(false);
menuEditCut = new JMenuItem("Cut", ′t′);
menuEditCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
menuEditCut.addActionListener(this);
menuEditCopy = new JMenuItem("Copy", ′C′);
menuEditCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
menuEditCopy.addActionListener(this);
menuEditPaste = new JMenuItem("Paste", ′P′);
menuEditPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
menuEditPaste.addActionListener(this);
JMenu menuEditDelete = new JMenu("Delete");
menuEditDelete.setMnemonic(′D′);
menuEditDeleteSelection = new JMenuItem("Selection", ′S′);
menuEditDeleteSelection.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
menuEditDeleteSelection.addActionListener(this);
menuEditDeleteLine = new JMenuItem("Line", ′L′);
menuEditDeleteLine.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
menuEditDeleteLine.addActionListener(this);
menuEditDeleteWord = new JMenuItem("Word", ′W′);
menuEditDeleteWord.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK));
menuEditDeleteWord.addActionListener(this);
menuEditFind = new JMenuItem("Find...", ′F′);
menuEditFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
menuEditFind.addActionListener(this);
menuEditReplace = new JMenuItem("Replace...", ′R′);
menuEditReplace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
menuEditReplace.addActionListener(this);
//menuEditReplace.setEnabled(false);
menuEditGoTo = new JMenuItem("Go To...", ′G′);
menuEditGoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
menuEditGoTo.addActionListener(this);
menuEditSelectAll = new JMenuItem("Select All", ′A′);
menuEditSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
menuEditSelectAll.addActionListener(this);
JMenu menuView = new JMenu("View", true);
menuViewFont = new JMenuItem("Font...", ′F′);
menuViewFont.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewFont.addActionListener(this);
menuViewColor = new JMenuItem("Color...", ′C′);
menuViewColor.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewColor.addActionListener(this);
menuViewClassic = new JCheckBoxMenuItem("Classic");
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("Status");
menuViewStatus.setMnemonic(′S′);
menuViewStatus.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewStatus.setState(true);
menuViewStatus.addActionListener(this);
menuViewWordWrap = new JCheckBoxMenuItem("Word Wrap");
menuViewWordWrap.setMnemonic(′W′);
menuViewWordWrap.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewWordWrap.setState(false);
menuViewWordWrap.addActionListener(this);
menuViewDoubleSpace = new JMenuItem("Double Space", ′D′);
menuViewDoubleSpace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK + InputEvent.ALT_MASK));
menuViewDoubleSpace.addActionListener(this);
JMenu menuHelp = new JMenu("Help", true);
menuHelpAbout = new JMenuItem("About", ′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.add(menuEditRedo);
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);
mb.add(menuView);
menuView.add(menuViewFont);
menuView.add(menuViewColor);
menuView.addSeparator();
menuView.add(menuViewClassic);
menuView.add(menuViewStatus);
menuView.add(menuViewWordWrap);
menuView.addSeparator();
menuView.add(menuViewDoubleSpace);
mb.add(menuHelp);
menuHelp.add(menuHelpAbout);
fr.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
fr.setSize(600,420);
fr.setVisible(true);
}
//ActionListener
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == menuFileNew) {
ta.replaceRange("", 0, ta.getText().length());
fns = null;
fileStatus.setText("New File");
undo.discardAllEdits();
menuEditUndo.setEnabled(false);
}
else if(ae.getSource() == menuFileOpen) {
String s = null;
StringBuffer strPool = new StringBuffer();
Frame openFileFrame = new Frame("Open file");
FileDialog fileDialog = new FileDialog(openFileFrame);
fileDialog.setMode(FileDialog.LOAD);
fileDialog.setFile("*.txt;*.java");
fileDialog.show();
String file = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(file != null) {
fns = directory + file;
ta.replaceRange("", 0, ta.getText().length());
BufferedReader br;
try{
br = new BufferedReader(new FileReader(fns));
s = br.readLine();
while(s != null) {
strPool.append(s + ′\15′ + "\12");//+0D+0A
s = br.readLine();
}
br.close();
ta.setText(strPool.toString());
} catch(IOException e) {
}
fileStatus.setText("file opened.");
isNewFile = true;
undo.discardAllEdits();
menuEditUndo.setEnabled(false);
}
}
else if(ae.getSource() == menuFileClose) {
ta.replaceRange("", 0, ta.getText().length());
fileStatus.setText("file closed without save");
undo.discardAllEdits();
menuEditUndo.setEnabled(false);
fns = null;
}
else if(ae.getSource() == menuFilePrint) {
JOptionPane.showMessageDialog(null, "TODO... Only the FIRST page now.", "Print", 1);
ta.printIt(ta.getText(), ta.getFont());
//todo...
}
//else if(ae.getSource() == menuFilePrintSetup) {
//ta.printItSetup(ta.getText(), ta.getFont());
//todo...
//}
else if(ae.getSource() == menuFileSave) {
OutputStreamWriter osw;
if(fns != null) {
try{
osw = new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream(fns)));
osw.write(ta.getText(), 0, ta.getText().length());
osw.close();
fileStatus.setText("file saved");
} catch(IOException e) {
}
if(fileStatus.getText().endsWith("*")) {
fileStatus.setText(fileStatus.getText().substring(0,
fileStatus.getText().length() - 1));
}
}
else {
Frame saveFileFrame = new Frame("Save file");
FileDialog fileDialog = new FileDialog(saveFileFrame);
fileDialog.setMode(FileDialog.SAVE);
fileDialog.setFile("*.txt;*.java");
fileDialog.show();
String file = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(file != null) {
fns = directory + file;
try{
osw = new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream(fns)));
osw.write(ta.getText(), 0, ta.getText().length());
osw.close();
fileStatus.setText("file saved");
} catch(IOException e) {
}
}
}
}
else if(ae.getSource() == menuFileSaveAs) {
OutputStreamWriter osw;
Frame saveFileFrame = new Frame("Save file");
FileDialog fileDialog = new FileDialog(saveFileFrame);
fileDialog.setMode(FileDialog.SAVE);
fileDialog.setFile("*.txt;*.java");
fileDialog.show();
String file = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(file != null) {
fns = directory + file;
try{
osw = new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream(fns)));
osw.write(ta.getText(), 0, ta.getText().length());
osw.close();
fileStatus.setText("file saved");
} catch(IOException e) {
}
}
}
else if(ae.getSource() == menuFileExit) {
System.exit(0);
}
else if(ae.getSource() == menuEditUndo) {
if(undo.canUndo()) {
try {
undo.undo();
} catch(CannotUndoException ex) {
System.out.println("Unable to undo: " + ex);
ex.printStackTrace();
}
if(!undo.canUndo())
menuEditUndo.setEnabled(false);
}
//else
// menuEditUndo.setEnabled(false);
}
else if(ae.getSource() == menuEditRedo) {
//todo...
}
else if(ae.getSource() == menuEditCut) {
ta.cut();
}
else if(ae.getSource() == menuEditCopy) {
ta.copy();
}
else if(ae.getSource() == menuEditPaste) {
ta.paste();
}
else if(ae.getSource() == menuEditDeleteSelection) {
ta.replaceRange("", ta.getSelectionStart(), ta.getSelectionEnd());
}
else if(ae.getSource() == menuEditDeleteLine) {
String str = ta.getText();
int pos = ta.getCaretPosition();
int lineStart = 0, lineEnd = 0;
lineStart = str.substring(0, pos).lastIndexOf(′\12′);
lineEnd = str.indexOf(′\15′, pos);
lineStart = (lineStart == -1) ? 0 : (lineStart - 1);
ta.replaceRange("", lineStart, lineEnd);
lineStart = (lineStart == 0) ? 0 : (lineStart + 2);
ta.setCaretPosition(lineStart);
}
else if(ae.getSource() == menuEditDeleteWord) {
String str = ta.getText();
int pos = ta.getCaretPosition();
int wordStart = 0, wordEnd = 0;
wordEnd = wordLocation(str, pos, true);
if(wordEnd == pos) {
wordStart = pos;
wordEnd = pos + 1;
ta.replaceRange("", wordStart, wordEnd);
}
else {
wordStart = wordLocation(str, pos, false);
if(wordStart == -1)
ta.replaceRange("", 0, wordEnd);
else
ta.replaceRange("", wordStart, wordEnd);
}
}
else if(ae.getSource() == menuEditFind) {
JDialog ds = new JDialog(this, "Find", true);
ds.getContentPane().setLayout(new FlowLayout());
ds.setResizable(false);
tfs = new TextField(15);
ds.getContentPane().add(tfs);
bs = new Button("Find");
bs.addActionListener(this);
Button bsc = new Button("Cancel");
bsc.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent bOke) {
dispose();
foundCount = 0;
}
});
ds.getContentPane().add(bs);
ds.getContentPane().add(bsc);
JLabel dsMessage1 = new JLabel("Found counts: ");
dsMessage2 = new JLabel(" 0");
dsLoop = new Checkbox("Loop");
dsLoop.setState(findingLoop);
dsMatchCase = new Checkbox("Match Case");
ds.getContentPane().add(dsLoop);
ds.getContentPane().add(dsMatchCase);
ds.getContentPane().add(dsMessage1);
ds.getContentPane().add(dsMessage2);
ds.setLocation(120, 120);
ds.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
FindStartPos = 0;
}
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -