【问题标题】:How to get the last typed word in jtextpane?如何在 jtextpane 中获取最后输入的单词?
【发布时间】:2015-11-27 21:52:04
【问题描述】:

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

例如,我输入“Hello World”,然后在中间添加“My”,结果是“Hello My World”。最后输入的单词是“My”,而不是“World”。

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

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");
    }
}

.

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);
    }
}

【问题讨论】:

  • 你的要求不够详细。如果您键入:“Helo World”会怎样?那是给你两个字吗?然后您意识到您忘记了第二个“l”并返回修复“Hello”这是否意味着您知道有 3 个单词“Helo”、“World”、“Hello”?如果在中间粘贴一些文本怎么办?那是一个词还是您需要解析文本中的词?如果您键入“wor ld”然后删除“”怎么办?你有 3 个词“wor”,“ld”“world”。这样做的真正意义是什么?
  • 啊,好点,我完全忘记了。那么在这种情况下,我想我会将最新的字符添加到文本窗格中,无论是输入还是粘贴。我正在为文本编辑器创建自己的撤消功能。现在我可以撤消字符串的最后一个单词,但这不是正确的功能。

标签: java string input jtextpane


【解决方案1】:

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

这就是我认为你可能正在做的事情。

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

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

【讨论】:

  • 我最初确实看过,但由于某种原因我无法弄清楚。我创建了一个 UndoManager 对象并尝试调用 undo(),但它根本不起作用,因为它 canUndo() 每次出于某种原因都会为 false。
  • @bobdylan,它的 3 行代码。 and would attempt to make a call to undo(), 在这 3 行中,它是在哪里做的?您只需使用操作来创建 JMenuItems 或 JButtons。您无需添加任何手动代码来调用撤消/重做功能。
  • 但我确实使用了菜单项的操作。如果用户单击 menuItem,我会检查 undoManger 是否可以撤消。如果可以,那么我会调用内置的 undo()。但由于某种原因,它永远无法撤消(),因为当输入某些内容并单击撤消按钮时,canUndo()总是返回false。
  • @bobdylan, I check to see if the undoManger can undo or not - 你在说什么?你不需要做任何事情。完整的逻辑包含在CompoundUndoManager 提供的操作中。创建菜单项是一行代码。发布您的SSCCE,展示您如何使用 CompoundUndoManager。那是一个带有 JTextPane 和 JMenuItem 的 JFrame。整个程序大约有 20-30 行代码。
  • 我已经发布了我的代码。由于某种原因,我无法导入CompoundUndoManager,所以我改用了UndoManager
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多