Java 如何获取jtextpane中最后键入的单词?

Java 如何获取jtextpane中最后键入的单词?,java,string,input,jtextpane,Java,String,Input,Jtextpane,如何获取JTextPane的最后一个键入的单词?我不是在JTextPane中询问字符串的最后一个单词。我希望在最后将每个键入的单词按顺序存储在堆栈中,而仅仅在JTextPane上获取文本是行不通的 例如,我键入“Hello World”,然后在中间加上“My”,导致“你好我的世界”。最后键入的单词是“我的”,而不是“世界” 使用内置撤消的最新代码: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; i

如何获取JTextPane的最后一个键入的单词?我不是在JTextPane中询问字符串的最后一个单词。我希望在最后将每个键入的单词按顺序存储在堆栈中,而仅仅在JTextPane上获取文本是行不通的

例如,我键入“Hello World”,然后在中间加上“My”,导致“你好我的世界”。最后键入的单词是“我的”,而不是“世界”

使用内置撤消的最新代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.undo.UndoManager;

import javax.swing.JMenuBar;
import javax.swing.JTextPane;
import javax.swing.JFrame;

public class EditMenu{

    private JMenuItem undo;
    private JMenu editMenu;
    private TextEditor editor;
    private UndoManager manager;

    public test(TextEditor t){

        editor = t;     
        manager = new UndoManager(); 
        buildEditMenu();
    }
    public JMenu getEditMenu(){
        return editMenu;
    }
    private void buildEditMenu(){//create and add items to the edit menu

        editMenu = new JMenu("Edit");
        undo = new JMenuItem("Undo");
        setKeyListeners();
        editMenu.add(undo);
        editMenuListeners();
    }
    private void setKeyListeners() {//add listener for CTRL Z 

        editor.addKeyListener(new KeyListener() {

            public void keyPressed(KeyEvent e) {
                if ((e.getKeyCode() == KeyEvent.VK_Z) && e.isControlDown()) {
                    undo();
                }
            }
            public void keyTyped(KeyEvent e) {}
            public void keyReleased(KeyEvent e) {}
        });     
    }
    private void editMenuListeners(){//create listeners for undo
        undoItemListener();
    }
    private void undoItemListener() {
        undo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                undo();
            }
        });     
    }
    private void undo(){

        if(manager.canUndo())
            manager.undo();
        else
            System.out.println("cannot undo");
    }
}

我正在为文本编辑器创建自己的撤消功能

我以为你会这么做

你应该在问题中说明这一点。请告诉我们您的要求,以便我们了解您正在做什么,并提供替代解决方案


例如,您可以查看。它试图将字符编辑合并到块编辑中,这基本上是Word的工作方式。

您的要求不够详细。如果你输入“Helo World”怎么办?这给了你两个词吗?然后你意识到你忘记了第二个“l”,然后回去修复“Hello”,这是否意味着你知道有三个词“Helo”,“World”,“Hello”?如果你在中间粘贴一些文字怎么办?这是一个单词还是你需要解析文本中的单词?如果键入“world”,然后删除“”,该怎么办?你有三个词“世界”、“世界”吗。这件事的真正意义是什么?啊,好的,我完全忘记了。在这种情况下,我想我会在文本窗格中添加最新的字符,无论是键入的还是粘贴的。我正在为文本编辑器创建自己的撤消功能。现在我可以撤消字符串的最后几个字,但这不是正确的功能。我最初确实查看了它,但由于某种原因我无法理解它。我创建了一个UndoManager对象,并试图调用undo(),但它根本不起作用,因为出于某种原因,每次canUndo()都会为false。@bobdylan,它的3行代码
并尝试调用undo(),
在这三行中的哪一行执行此操作?您只需使用这些操作来创建JMenuItems或jbutton。您不需要添加任何手动代码来调用撤销/重做功能,但我使用菜单项的操作。如果用户单击菜单项,我将检查undoManger是否可以撤消。如果可以,那么我调用内置的undo()。但由于某些原因,它永远无法撤消(),因为当键入某些内容并单击“撤消”按钮时,canUndo()总是返回false。@bobdylan,
我检查undoManger是否可以撤消
-你在说什么?你不需要做任何事。完整的逻辑包含在
compoundomanager
提供的操作中。这是创建菜单项的一行代码。发布演示如何使用CompoundUndoManager的日志。这是一个带有JTextPane和JMenuItem的JFrame。整个程序大约需要20-30行代码。我已经发布了我的代码。由于某些原因,我无法导入
compoundomanager
,因此我使用了
UndoManager
class TextEditor extends JTextPane{

    public TextEditor(){
        super();
    }
    private JMenuBar buildMenus() {//create and add all the JMenus to the JMenuBar

        JMenuBar mb = new JMenuBar();
        EditMenu editMenu = new EditMenu(this);
        mb.add(editMenu.getEditMenu());

        return mb;
    }
    public static void main(String[] args){

        JFrame frame = new JFrame("Editor");
        TextEditor editor = new TextEditor();

        frame.setContentPane(editor);
        frame.setJMenuBar(editor.buildMenus());//add the menu bar to the frame
        frame.setSize(1200, 800);
        frame.setDefaultCloseOperation(3);//exit on close
        frame.setVisible(true);
    }
}