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); } } }
示例项目见附件
可以直接运行 java -jar base64Demo-0.0.1-SNAPSHOT.jar
相关推荐
- `javax.swing.undo`:提供了撤销/重做功能的支持,常用于文本编辑组件。 Swing的版面结构是构建GUI布局的关键。它允许开发者通过布局管理器(Layout Manager)来控制组件的位置和大小。例如,`JFrame`、`JDialog`...
2. **定义常量**:定义与消息相关的常量,例如`WM_CUT`、`WM_COPY`、`WM_PASTE`、`WM_CLEAR`、`EM_UNDO`和`WM_CONTEXTMENU`,这些都是与剪切、复制、粘贴、清除和右键菜单相关的Windows消息。 3. **定义自定义窗体...
5. **菜单和快捷键**:尽管描述中提到没有实现右键菜单,但记事本通常会有一个标准的菜单栏,包括“文件”、“编辑”等选项,并且会有对应的快捷键支持。在Swing中,可以使用`JMenuBar`、`JMenu`和` JMenuItem`等类...
- 应用程序接口:提供公共的AddCommand、Undo和Redo方法供其他部分调用。 6. **扩展性和性能考虑**: 框架应支持多种类型的命令,比如文本编辑、列表选择、绘图等。同时,为了防止内存消耗过大,可以设定撤销/...
一旦会话开始使用临时表,该会话的Temporary Undo状态便固定下来,直到会话结束。 - **兼容性要求**:Temporary Undo 特性要求数据库的`COMPATIBLE`初始化参数设置为12.1.0.0或更高版本。 - **Oracle Active Data ...
在IT行业中,“Undo”是一个非常基础且重要的概念,它广泛应用于各种软件和应用程序中,特别是在文本编辑器、图像处理软件以及编程环境中。这个功能允许用户撤销最近的操作,恢复到操作前的状态,极大地提高了工作...
- **更新UI**:每次添加新的undo对象后,都需要更新UI,比如禁用或启用“撤销”和“重做”菜单项,根据堆栈的状态来反映是否可以执行这些操作。 - **处理撤销/重做**:当用户选择“撤销”时,从undo堆栈弹出最新的...
在达梦数据库中,修改UNDO_RETENTION参数主要是为了平衡数据库的性能和空间利用率。过短的UNDO_RETENTION可能导致事务无法完成回滚,尤其是在长时间运行的事务中,可能会丢失必要的撤销信息。反之,如果设置得过长,...
在编程领域,撤销(Undo)和重做(Redo)功能是用户界面中常见的操作,它们允许用户取消或恢复最近的更改。在C#中,我们可以利用.NET框架提供的事件驱动和面向对象特性来实现这样的功能。这篇实验主要探讨了如何在...
在这个例子中,`javax.swing.*` 和 `java.awt.*` 被导入,这两个包提供了创建窗口、按钮、菜单等组件的基本类。`JFrame` 是窗口的基础类,`JTextArea` 用于显示和编辑文本,`JMenuBar` 用于创建菜单栏,`JMenuItem` ...
通过以上介绍可以看出,在Oracle数据库中,正确管理和优化Temp表空间和UNDO表空间是非常重要的,尤其是对于那些执行大量排序、分组操作以及频繁进行事务处理的应用系统来说。合理利用Resize调整大小、替换原有表空间...
Oracle数据库的Undo机制是其核心特性之一,它主要用于支持事务的回滚、读取一致性和闪回查询。本文将深入探讨Undo的详细功能及其优势。 首先,数据操纵语言(DML)包括INSERT、UPDATE、DELETE和MERGE等SQL语句,...
如果事务中的某个操作失败,系统可以利用undo信息回滚整个事务,恢复到事务开始前的状态。此外,即使事务成功提交,undo信息也会暂时保留,以支持其他并发事务的读一致性。 4. **如何切换Undo表空间** 切换undo表...
### Oracle 12C R2 本地UNDO模式详解 #### 一、概述 Oracle 12C R2 引入了一种新的UNDO管理模式——本地UNDO...掌握本地UNDO模式的使用方法,可以帮助DBA更好地管理数据库性能和资源,从而提升系统的稳定性和可靠性。
Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction logs,分为online和...
在IT行业中,"redo undo"框架是用于实现撤销/重做功能的核心技术,常见于各种软件和应用程序中,如文本编辑器、图像处理软件、数据库系统等。它允许用户取消最近的操作并恢复先前的状态,提供了对用户交互的强大支持...
在Oracle数据库的Real Application Clusters (RAC)环境中,REDO和UNDO管理扮演着至关重要的角色,确保数据的安全性、事务处理以及数据恢复。在RAC架构中,多个实例共享同一物理数据库,这就需要对REDO和UNDO管理进行...
在Oracle数据库管理中,有时需要对Undo表空间进行管理和优化。特别是当Undo表空间因为历史数据积累而变得过大时,可能会影响数据库性能。本文将详细介绍如何通过新建一个Undo表空间并替换原有的Undo表空间来实现其...