gpt4 book ai didi

java - 如何在 Java 中为 MVC 模型实现撤消/重做?

转载 作者:行者123 更新时间:2023-11-30 07:22:26 27 4
gpt4 key购买 nike

我无法理解使用 UndoManager 的撤消/重做功能,以及将其与 MVC 模型集成。

我不确定将各种方法放在哪里(在模型、 View 或控件中)而且我仍然不确定如何使用撤消管理器。

我的控件类实现了UndoableEditListener它创建:

private UndoManager manager = new UndoManager();

并在:

public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Undo")) {
try {
manager.undo();
} catch (CannotUndoException ex) {
ex.printStackTrace();
}
}
}

到这里我明白了,但剩下的我不确定该怎么做。我知道我必须在模型和 View 类中添加更多内容,但不确定在哪里。我必须参加以下类(class)吗?

public class UndoAction extends AbstractAction {}

public void undoableEditHappened(UndoableEditEvent e) {

我只是在文本字段中放置一个整数,然后我希望能够撤消它。我在 View 类的文本字段中设置数字。我想以最简单的方式实现这一点,没有花哨的编码!这是我的 assg 的一小部分,但我无法让它工作!!

============================================= ===========这是我的代码的更详细描述,也许它会有所帮助:

我有一个模型、 View 和控制包。

Contol 有:ButtonGUIControl.java,它同时实现了

    ActionListener and 
UndoableEditListener.


final UndoManager manager = new UndoManager();

在actionPerformed方法中,调用

    if (e.getActionCommand().equals("Undo")){

try {

manager.undo();
}

并在:

    public void undoableEditHappened(UndoableEditEvent evt) {
manager.addEdit(evt.getEdit());

在 View 中:扩展 JTextField 的 Grid.java 将在需要在 GUI 上显示数字的任何地方添加以下内容:(模型只是我的模型类的一个实例)

    getDocument().addUndoableEditListener(new ButtonGUIControl(model));

可能是因为 UndoManager 是在不同的包中创建的?我真的不知道如何调试它了!!

如果有帮助,我可以发布我的全部代码。我想我不确定如何将它与我的 mvc 模型结构集成。

最佳答案

退后一步。这里的整个想法是用户将使用您的应用程序并对某些内容进行一系列更改。文本编辑器就是一个很好的例子。您可以插入字符和行,再次删除它们,用其他文本替换文本,滚动文本等。为了使用 MVC 支持这一点,您有一个保存状态的模型和一个显示它的 View 。

您的第一直觉可能是让 View 直接访问模型,然后在每次用户进行更改时刷新 View ,但很难通过该实现撤消这些更改。相反,您对用户可以在能够执行该更改并随后可以撤消该更改的类中进行的每一种更改进行编码。

例如,插入文本的操作将由知道插入点的字符偏移量和要插入的字符串的类来实现。执行操作会在偏移量处插入字符串,而撤消操作会删除该插入点后正确数量的字符。您将有一个不同的类来处理删除,另一个类来处理滚动等。

每次用户执行某些操作时, View 都会构造这些 UndoableEdit 类之一,并告诉实例自行运行 (redo())。执行后,您将该 UndoableEdit 放在 UndoableEdit 实例列表的末尾,这些实例表示用户到目前为止已执行的所有操作。这个列表使得支持任何顺序的撤消请求、重做请求和实际编辑操作变得非常容易(导致更多的 UndoableEdit 被放在列表中)。

回到你的问题。如果您的应用程序需要支持撤消和重做,那么您需要实现一个 UndoManager,它只管理 UndoableEdit 列表并根据需要执行撤消和重做。您还必须实现一大堆 UndoableEdits,一个用于您的用户将对 UI 执行的每种操作。至于听众,我看不出你真的需要那样做。

关于java - 如何在 Java 中为 MVC 模型实现撤消/重做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com