📄 javafilter.java
字号:
package homework;
/*
* javaFilter.java
* one additional file:
* MyStyledDocument
*/
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.undo.*;
import java.io.*;
public class javaFilter extends JFrame {
JFileChooser chooser;
JTextPane textPane;
AbstractDocument doc;
String newline = "\n";
HashMap actions;
Component curComponet = this.getComponent(0);
//is changed or not
boolean changed;
File file;
MyStyledDocument cur;
//undo helpers
protected UndoAction undoAction;
protected RedoAction redoAction;
protected UndoManager undo = new UndoManager();
DefaultEditorKit a = new DefaultEditorKit();
public javaFilter() {
//Create the text pane and configure it.
changed = false;
file = null;
setTitle();
chooser = new JFileChooser();
textPane = new JTextPane(cur = new MyStyledDocument());
textPane.setCaretPosition(0);
textPane.setMargin(new Insets(5, 5, 5, 5));
StyledDocument styledDoc = textPane.getStyledDocument();
if (styledDoc instanceof AbstractDocument) {
doc = (AbstractDocument) styledDoc;
doc.setDocumentFilter(new DocumentFilter());
} else {
System.err.println(
"Text pane's document isn't an AbstractDocument!");
System.exit( -1);
}
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(400, 400));
//Create the status area.
JPanel statusPane = new JPanel(new GridLayout(1, 1));
CaretListenerLabel caretListenerLabel =
new CaretListenerLabel("Caret Status");
statusPane.add(caretListenerLabel);
//Add the components.
getContentPane().add(scrollPane, BorderLayout.CENTER);
getContentPane().add(statusPane, BorderLayout.PAGE_END);
//Set up the menu bar.
createActionTable(textPane);
JMenu fileMenu = createFileMenu();
JMenu editMenu = createEditMenu();
JMenu styleMenu = createStyleMenu();
JMenu aboutMenu = createAboutMenu();
JMenuBar mb = new JMenuBar();
mb.add(fileMenu);
mb.add(editMenu);
mb.add(styleMenu);
mb.add(aboutMenu);
setJMenuBar(mb);
//Add some key bindings.
addBindings();
//Start watching for undoable edits and caret changes.
doc.addUndoableEditListener(new MyUndoableEditListener());
textPane.addCaretListener(caretListenerLabel);
addWindowListener(new closeAdapter());
}
public void setTitle() {
setTitle("Java Filter " + file);
}
class closeAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
if (changed) {
int ret = JOptionPane.showConfirmDialog(null, "Save File?",
"Confirm", JOptionPane.YES_NO_OPTION);
if (ret == JOptionPane.YES_OPTION) {
saveFile();
System.exit(0);
} else if (ret == JOptionPane.NO_OPTION) {
System.exit(0);
}
} else {
System.exit(0);
}
}
}
//This listens for and reports caret movements.
protected class CaretListenerLabel extends JLabel implements CaretListener {
public CaretListenerLabel(String label) {
super(label);
}
//Might not be invoked from the event dispatching thread.
public void caretUpdate(CaretEvent e) {
changed = true;
displaySelectionInfo(e.getDot(), e.getMark());
}
//This method can be invoked from any thread. It
//invokes the setText and modelToView methods, which
//must run in the event dispatching thread. We use
//invokeLater to schedule the code for execution
//in the event dispatching thread.
protected void displaySelectionInfo(final int dot,
final int mark) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (dot == mark) { // no selection
try {
Rectangle caretCoords = textPane.modelToView(dot);
//Convert it to view coordinates.
setText("caret: text position: " + dot
+ ", view location = ["
+ caretCoords.x + ", "
+ caretCoords.y + "]"
+ newline);
} catch (BadLocationException ble) {
setText("caret: text position: " + dot + newline);
}
} else if (dot < mark) {
setText("selection from: " + dot
+ " to " + mark + newline);
} else {
setText("selection from: " + mark
+ " to " + dot + newline);
}
}
});
}
}
//This one listens for edits that can be undone.
protected class MyUndoableEditListener implements UndoableEditListener {
public void undoableEditHappened(UndoableEditEvent e) {
//Remember the edit and update the menus.
undo.addEdit(e.getEdit());
undoAction.updateUndoState();
redoAction.updateRedoState();
}
}
//Add a couple of emacs key bindings for navigation.
protected void addBindings() {
InputMap inputMap = textPane.getInputMap();
//Ctrl-b to go backward one character
KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_B, Event.CTRL_MASK);
inputMap.put(key, DefaultEditorKit.backwardAction);
//Ctrl-f to go forward one character
key = KeyStroke.getKeyStroke(KeyEvent.VK_F, Event.CTRL_MASK);
inputMap.put(key, DefaultEditorKit.forwardAction);
//Ctrl-p to go up one line
key = KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK);
inputMap.put(key, DefaultEditorKit.upAction);
//Ctrl-n to go down one line
key = KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK);
inputMap.put(key, DefaultEditorKit.downAction);
}
//Create the File menu.
protected JMenu createFileMenu() {
JMenu menu = new JMenu("File");
//New , Open , Save and Exit are actions of my own creation.
menu.add(new NewAction());
menu.addSeparator();
menu.add(new OpenAction());
menu.add(new SaveAction());
menu.add(new SaveAsAction());
menu.addSeparator();
menu.add(new ExitAction());
return menu;
}
//Create the About menu.
protected JMenu createAboutMenu() {
JMenu menu = new JMenu("About");
menu.add(new AboutAction());
return menu;
}
//Create the edit menu.
protected JMenu createEditMenu() {
JMenu menu = new JMenu("Edit");
//Undo and redo are actions of our own creation.
undoAction = new UndoAction();
menu.add(undoAction);
redoAction = new RedoAction();
menu.add(redoAction);
menu.addSeparator();
//These actions come from the default editor kit.
//Get the ones we want and stick them in the menu.
menu.add(getActionByName(DefaultEditorKit.cutAction));
menu.add(getActionByName(DefaultEditorKit.copyAction));
menu.add(getActionByName(DefaultEditorKit.pasteAction));
menu.addSeparator();
menu.add(getActionByName(DefaultEditorKit.selectAllAction));
menu.add(new deleteCommentAction());
return menu;
}
//Create the style menu.
protected JMenu createStyleMenu() {
JMenu menu = new JMenu("Style");
Action action = new StyledEditorKit.BoldAction();
action.putValue(Action.NAME, "Bold");
menu.add(action);
action = new StyledEditorKit.ItalicAction();
action.putValue(Action.NAME, "Italic");
menu.add(action);
action = new StyledEditorKit.UnderlineAction();
action.putValue(Action.NAME, "Underline");
menu.add(action);
menu.addSeparator();
menu.add(new StyledEditorKit.FontSizeAction("12", 12));
menu.add(new StyledEditorKit.FontSizeAction("14", 14));
menu.add(new StyledEditorKit.FontSizeAction("18", 18));
menu.addSeparator();
menu.add(new StyledEditorKit.FontFamilyAction("Serif",
"Serif"));
menu.add(new StyledEditorKit.FontFamilyAction("SansSerif",
"SansSerif"));
menu.addSeparator();
menu.add(new StyledEditorKit.ForegroundAction("Red",
Color.red));
menu.add(new StyledEditorKit.ForegroundAction("Green",
Color.green));
menu.add(new StyledEditorKit.ForegroundAction("Blue",
Color.blue));
menu.add(new StyledEditorKit.ForegroundAction("Black",
Color.black));
return menu;
}
protected SimpleAttributeSet[] initAttributes(int length) {
//Hard-code some attributes.
SimpleAttributeSet[] attrs = new SimpleAttributeSet[length];
attrs[0] = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrs[0], "SansSerif");
StyleConstants.setFontSize(attrs[0], 16);
attrs[1] = new SimpleAttributeSet(attrs[0]);
StyleConstants.setBold(attrs[1], true);
attrs[2] = new SimpleAttributeSet(attrs[0]);
StyleConstants.setItalic(attrs[2], true);
attrs[3] = new SimpleAttributeSet(attrs[0]);
StyleConstants.setFontSize(attrs[3], 20);
attrs[4] = new SimpleAttributeSet(attrs[0]);
StyleConstants.setFontSize(attrs[4], 12);
attrs[5] = new SimpleAttributeSet(attrs[0]);
StyleConstants.setForeground(attrs[5], Color.red);
return attrs;
}
//The following two methods allow us to find an
//action provided by the editor kit by its name.
private void createActionTable(JTextComponent textComponent) {
actions = new HashMap();
Action[] actionsArray = textComponent.getActions();
for (int i = 0; i < actionsArray.length; i++) {
Action a = actionsArray[i];
actions.put(a.getValue(Action.NAME), a);
}
}
private Action getActionByName(String name) {
return (Action) (actions.get(name));
}
// delete Comment Action
class deleteCommentAction extends AbstractAction {
deleteCommentAction() {
super("Delete Comment");
setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
StringBuffer content = new StringBuffer(textPane.getText());
deleteinfo(content, 0);
textPane.setText(new String(content));
}
}
void deleteinfo(StringBuffer content, int pos) {
for (int i = pos; i < content.length() - 1; i++) {
int start = i;
int end = i + 2;
if (content.substring(start, start + 2).equals("//")) { //end index shoud be exclusive
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -