1,让文本域可以undo,比如支持Ctrl+Z,Ctrl+Y,Ctrl+S(联想windows的notepad)
下面是一个可以undo的文本域:
- package com.swing.component;
- import java.awt.event.ActionEvent;
- import javax.swing.AbstractAction;
- import javax.swing.JTextArea;
- import javax.swing.KeyStroke;
- import javax.swing.event.UndoableEditEvent;
- import javax.swing.event.UndoableEditListener;
- import javax.swing.text.Document;
- import javax.swing.undo.CannotRedoException;
- import javax.swing.undo.CannotUndoException;
- import javax.swing.undo.UndoManager;
- public class UndoTextArea extends JTextArea {
- private static final long serialVersionUID = 2622113838910292609L;
- private UndoManager undo = new UndoManager();
- private Document doc = getDocument();
- private StringBuffer stringbuf = null;
- public void stopUndo() {
- // undo.die();
- undo.discardAllEdits();
- }
- public UndoManager getUndo() {
- return undo;
- }
- public void setUndo(UndoManager undo) {
- this.undo = undo;
- }
- public Document getDoc() {
- return doc;
- }
- public void setDoc(Document doc) {
- this.doc = doc;
- }
- /**
- * @autho : whuang dicate original content of the area
- * @return
- */
- public StringBuffer getStringbuf() {
- return stringbuf;
- }
- /***
- * dicate original content of the area
- *
- * @param stringbuf
- */
- public void setStringbuf(StringBuffer stringbuf) {
- this.stringbuf = stringbuf;
- }
- private void initlize() {
- doc.addUndoableEditListener(new UndoableEditListener() {
- public void undoableEditHappened(UndoableEditEvent e) {
- undo.addEdit(e.getEdit());
- }
- });
- addActionMap();
- }
- public UndoTextArea() {
- initlize();
- }
- public UndoTextArea(int rows, int columns) {
- super(rows, columns);
- initlize();
- }
- public void addActionMap() {
- getActionMap().put("Undo", new AbstractAction("Undo11") {
- private static final long serialVersionUID = 2434402629308759912L;
- public void actionPerformed(ActionEvent evt) {
- try {
- boolean b = undo.canUndo();
- // System.out.println("whether undo : "+b);
- if (b) {
- undo.undo();
- }
- } catch (CannotUndoException e) {
- }
- }
- });
- getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo");
- getActionMap().put("Redo", new AbstractAction("Redo1111") {
- private static final long serialVersionUID = 5348330289578410517L;
- public void actionPerformed(ActionEvent evt) {
- try {
- if (undo.canRedo()) {
- undo.redo();
- }
- } catch (CannotRedoException e) {
- }
- }
- });
- getInputMap().put(KeyStroke.getKeyStroke("control R"), "Redo");
- getActionMap().put("Copy", new AbstractAction("Copy111") {
- private static final long serialVersionUID = -5151480809625853288L;
- public void actionPerformed(ActionEvent evt) {
- copy();
- }
- });
- getInputMap().put(KeyStroke.getKeyStroke("control C"), "Copy");
- getActionMap().put("Cut", new AbstractAction("Cut") {
- private static final long serialVersionUID = 7316612864835857713L;
- public void actionPerformed(ActionEvent evt) {
- cut();
- }
- });
- getInputMap().put(KeyStroke.getKeyStroke("control X"), "Cut");
- getActionMap().put("Paste", new AbstractAction("Paste111") {
- private static final long serialVersionUID = -3548620001691220571L;
- public void actionPerformed(ActionEvent evt) {
- paste();
- }
- });
- getInputMap().put(KeyStroke.getKeyStroke("control V"), "Paste");
- // redo Ctrl + Y
- getActionMap().put("Redo", new AbstractAction("reDo111") {
- private static final long serialVersionUID = -3548620001691220571L;
- public void actionPerformed(ActionEvent evt) {
- if (undo.canRedo()) {
- undo.redo();
- }
- }
- });
- getInputMap().put(KeyStroke.getKeyStroke("control Y"), "Redo");
- }
- }
示例:
- inputTextArea = new UndoTextArea();
- inputTextArea.setLineWrap(true);
- inputTextArea.setWrapStyleWord(true);
(2)增加右键菜单
效果如下:
代码如下:
- package com.swing.menu;
- import java.awt.event.MouseEvent;
- import javax.swing.JMenuItem;
- import javax.swing.JPopupMenu;
- import javax.swing.JTextField;
- import javax.swing.event.MouseInputListener;
- import javax.swing.text.JTextComponent;
- public class MenuUtil2
- {
- public static final String ACTION_STR_OPEN = "open";
- public static final String ACTION_STR_DELETE_FILE = "delete file";
- public static final String ACTION_STR_EXIT = "exit";
- public static final String ACTION_STR_BROWSER = "browser";
- public static final String ACTION_STR_COPY = "copy";
- public static final String ACTION_STR_COPY_ALL = "copy all";
- public static final String ACTION_STR_PASTE = "paste";
- public static final String ACTION_STR_REPLACE_ALL = "replace all";
- public static final String ACTION_STR_DELETE_CONTENT = "delete";
- public static final String ACTION_STR_DELETE_ALL_CONTENT = "delete all";
- public static final String ACTION_STR_SELECT_ALL_CONTENT = "select all";
- public static final String ACTION_STR_REFRESH = "refresh";
- public static final String ACTION_STR_COPY_FILEPATH = "copy file path";
- public static final String ACTION_STR_FILE_RENAME = "rename";
- public static final String ACTION_STR_CLOSE = "close";
- public static final String ACTION_STR_NEW = "new";
- public static final String ACTION_STR_ADD = "add";
- public static final String ACTION_STR_SAVE = "save";
- public static final String ACTION_STR_EDIT = "edit";
- public static final String ACTION_STR_VIEW = "view";
- public static final String ACTION_STR_UPDATE = "update";
- public static final String ACTION_STR_INSERT = "insert";
- private MenuUtil2()
- {
- throw new Error("Don't let anyone instantiate this class.");
- }
- /***
- * 给文本框增加右键菜单.
- *
- * @param field2
- */
- public static void setPopupMenu(final JTextComponent field2)
- {
- field2.addMouseListener(new MouseInputListener()
- {
- @Override
- public void mouseMoved(MouseEvent e)
- {
- }
- @Override
- public void mouseDragged(MouseEvent e)
- {
- }
- @Override
- public void mouseReleased(MouseEvent e)
- {
- // super.mousePressed(e);
- if (e.getButton() == MouseEvent.BUTTON3)
- {
- JPopupMenu textMenu = new JPopupMenu();
- JMenuItem copyM = new JMenuItem(MenuUtil2.ACTION_STR_COPY);
- JMenuItem copyAllM = new JMenuItem(
- MenuUtil2.ACTION_STR_COPY_ALL);
- JMenuItem pasteM = new JMenuItem(MenuUtil2.ACTION_STR_PASTE);
- JMenuItem replaceAllM = new JMenuItem(MenuUtil2.ACTION_STR_REPLACE_ALL);
- JMenuItem deleteM = new JMenuItem(
- MenuUtil2.ACTION_STR_DELETE_CONTENT);
- JMenuItem deleteAllM = new JMenuItem(
- MenuUtil2.ACTION_STR_DELETE_ALL_CONTENT);
- JMenuItem selAllM = new JMenuItem(
- MenuUtil2.ACTION_STR_SELECT_ALL_CONTENT);
- Menu2ActionListener myMenuListener=new Menu2ActionListener(field2);
- copyM.addActionListener(myMenuListener);
- copyAllM.addActionListener(myMenuListener);
- pasteM.addActionListener(myMenuListener);
- replaceAllM.addActionListener(myMenuListener);
- deleteM.addActionListener(myMenuListener);
- deleteAllM.addActionListener(myMenuListener);
- selAllM.addActionListener(myMenuListener);
- textMenu.add(copyM);
- textMenu.add(copyAllM);
- if(!(field2 instanceof JTextField)){
- /*因为JTextField 没有 ta2.insert(content, caret) 方法 .*/
- textMenu.add(pasteM);
- }
- textMenu.add(replaceAllM);
- textMenu.add(deleteM);
- textMenu.add(deleteAllM);
- textMenu.add(selAllM);
- textMenu.show(e.getComponent(), e.getX(), e.getY());
- }
- }
- @Override
- public void mousePressed(MouseEvent e)
- {
- }
- @Override
- public void mouseExited(MouseEvent e)
- {
- }
- @Override
- public void mouseEntered(MouseEvent e)
- {
- }
- @Override
- public void mouseClicked(MouseEvent e)
- {
- }
- });
- }
- }
- package com.swing.menu;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- import javax.swing.text.JTextComponent;
- import com.common.util.WindowUtil;
- /***
- * 文本域的右键菜单响应事件.
- *
- * @author huangwei
- *
- */
- public class Menu2ActionListener implements ActionListener {
- private JTextComponent area2;
- public Menu2ActionListener(JTextComponent area2) {
- super();
- this.area2 = area2;
- }
- @Override
- public void actionPerformed(ActionEvent event) {
- String command = event.getActionCommand();
- if (command.equals(MenuUtil2.ACTION_STR_DELETE_CONTENT)) {
- // System.out.println("delete word");
- area2.replaceSelection("");
- } else if (command.equals(MenuUtil2.ACTION_STR_DELETE_ALL_CONTENT)) {
- area2.selectAll();
- area2.replaceSelection("");
- } else if (command.equals(MenuUtil2.ACTION_STR_SELECT_ALL_CONTENT)) {
- if (area2 != null) {
- area2.selectAll();
- // System.out.println("select all");
- }
- } else if (command.equals(MenuUtil2.ACTION_STR_COPY)) {
- String selectContent = area2.getSelectedText();
- if (selectContent == null || selectContent.equals("")) {
- return;
- }
- WindowUtil.setSysClipboardText(selectContent);
- } else if (command.equals(MenuUtil2.ACTION_STR_COPY_ALL)) {
- String selectContent = area2.getText();
- if (selectContent == null || selectContent.equals("")) {
- return;
- }
- WindowUtil.setSysClipboardText(selectContent);
- } else if (command.equals(MenuUtil2.ACTION_STR_PASTE)) {
- String content = WindowUtil.getSysClipboardText();
- if (content == null || content.equals("")) {
- return;
- }
- int caret = area2.getCaretPosition();
- if(area2 instanceof JTextArea){
- JTextArea ta2=(JTextArea)area2;
- ta2.insert(content, caret);
- }
- } else if (command.equals(MenuUtil2.ACTION_STR_REPLACE_ALL)) {
- String content = WindowUtil.getSysClipboardText();
- if (content == null || content.equals("")) {
- return;
- }
- area2.setText(content);
- }
- }
- }
时间: 2024-10-09 17:41:57