Java 如何获取jtextpane中最后键入的单词?
如何获取JTextPane的最后一个键入的单词?我不是在JTextPane中询问字符串的最后一个单词。我希望在最后将每个键入的单词按顺序存储在堆栈中,而仅仅在JTextPane上获取文本是行不通的 例如,我键入“Hello World”,然后在中间加上“My”,导致“你好我的世界”。最后键入的单词是“我的”,而不是“世界” 使用内置撤消的最新代码: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
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);
}
}