当前位置: 首页 > 知识库问答 >
问题:

创建一个可撤消的JTextField

耿锦
2023-03-14

我实现了一个可撤消的JTextField,问题是当我创建多个JTextField时,它只是撤消创建的最后一个实例。代码如下-要复制,请在第三个字段中输入一些文本,然后在第一个文本字段中输入一些代码并键入ctrl-z以撤消-它只从第三个文本字段中删除文本。有人能看到我做错了什么吗?

import java.awt.BorderLayout;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;

public class UndoableTextFieldTest 
{
    public static void main(String... s)
    {
        new UndoableTextFieldTest();
    }

    public UndoableTextFieldTest() 
    {
        JFrame frame = new JFrame("UndoableTextFieldTest");

        UndoableTextField f1 = new UndoableTextField();
        UndoableTextField f2 = new UndoableTextField();
        UndoableTextField f3 = new UndoableTextField();

        frame.setLayout(new BorderLayout());
        frame.getContentPane().add(f1, BorderLayout.NORTH);
        frame.getContentPane().add(f2, BorderLayout.CENTER);
        frame.getContentPane().add(f3, BorderLayout.SOUTH);

        frame.setSize(360, 115);
        frame.setVisible(true);
    }


    public class UndoableTextField extends JTextField
    {    
        KeyStroke undoKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK);
        KeyStroke redoKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK);

        public UndoableTextField()
        {
            UndoManager undoManager = new UndoManager();

            getDocument().addUndoableEditListener(new UndoableEditListener() 
            {
                @Override
                public void undoableEditHappened(UndoableEditEvent e) 
                {
                    undoManager.addEdit(e.getEdit());
                }
            });

            getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(undoKeyStroke, "undoKeyStroke");

            getActionMap().put("undoKeyStroke", new AbstractAction() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    try 
                    {
                        undoManager.undo();
                    } catch (CannotUndoException cue) {}
                }
            });

            getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(redoKeyStroke, "redoKeyStroke");
            getActionMap().put("redoKeyStroke", new AbstractAction() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    try 
                    {
                        undoManager.redo();
                    } catch (CannotRedoException cre) {}
                }
            });
        }    
    }
}

共有1个答案

公冶渝
2023-03-14

我不是100%确定,但我的猜测是您使用的输入映射在窗口中的所有组件之间共享。前两个字段的放置被第三个字段的放置覆盖。

如果我使用getInputMap(),则撤消似乎对每个文本字段都有效。

 类似资料:
  • 问题内容: 众所周知,Java 是不可变的。自从成立以来,不可变字符串是Java的重要补充。不变性允许快速访问和大量优化,与C风格的字符串相比,不易出错,并有助于加强安全性模型。 无需使用骇客就可以创建一个可变的对象,即 引导类加载器中的类 JNI(或JNA,因为它需要JNI) 但是有可能仅使用普通Java,以便可以随时修改字符串吗?问题是 如何 ? 问题答案: 使用Charset构造函数创建一个

  • Revert 命令可以撤消之前做过的某个提交。 练习 1,先查看一下项目的提交历史: → git log --oneline fb11f83 让 README.md 标题的首字母大写 0fd9dac 让标题微笑 7086650 添加 .gitignore b5773ad 设置相关资源文档标题 23f3c2b 添加相关资源文档 a454700 设置说明文档的标题 39975b3 初始化 “添加 .

  • 我是一个android编程新手,在我的应用程序中,我使用recycleview来显示SQLite数据库的内容,我将数据库读入一个Arraylist,我在recycleview中显示它。我已经成功实现了向左滑动(删除项目)和向右滑动(编辑项目)功能。我在向左滑动时遇到了一个问题,这意味着在删除功能中,我实现了一个撤销功能: (SequenceItem 是我的自定义项类,sequenceItemLis

  • Git提供了多种修复你开发过程中的错误的方法. 方法的选择取决于你的情况: 包含有错误的文件是否提交了(commited); 如果你把它已经提交了, 那么你是否把有错误的提交已与其它人共享这也很重要. 修复未提交文件中的错误(重置) 如果你现在的工作目录(work tree)里搞的一团乱麻, 但是你现在还没有把它们提交; 你可以通过下面的命令, 让工作目录回到上次提交时的状态(last commi

  • 问题内容: 我已经阅读了关于此的所有问题,但仍然没有找到答案。因此,请勿将其标记为重复项。 我正在将AngularFire与Angular 2和Typescript一起使用。我正在使用从端点提取24条最近记录的列表。这是我的代码: 如预期的那样,这将返回24个最新故事的列表,但是当我使用以下命令将它们呈现在页面上时: 它在顶部显示最旧的故事,在底部显示最新的故事。我了解为什么会这样,但我并不是说这

  • 问题内容: 假设我有以下两个变量: 我怎样才能获得的价值是价值?也就是说,如何展开unicode格式,但保留十六进制的值? 如果我这样做: 那是不对的… 救命! 问题答案: U + 0000和U + 00FF之间的代码点以ISO 8859-1或Latin 1编码映射到相同的字节值。