如果我绘制两个形状并撤消,为什么按钮禁用有效,而如果我绘制一个形状并撤消则不工作



基本上,我正在制作一个允许您绘制形状的应用程序。我正在开发一项允许您"撤消平局"的功能。所有绘图都在绘图面板上进行。我得到了撤消的算法部分,移动到堆栈....,但是在集合中没有更多形状可绘制后,我无法禁用撤消按钮。(无法再撤消)

这是我用来存储形状的两个集合

 //to store shapes that have been drawn 
 private final List<ShapeColorThickness> myShapesToDraw
  //store shapes that have been "undone"
  private final Stack<ShapeColorThickness> myUndoShapes;

这是用于处理对撤消按钮的单击的抽象操作类。

public class UndoAction extends AbstractAction{
    private final DrawingPanel myDrawingPanel;
    public UndoAction(String name, DrawingPanel panel) {
        super(name);
        myDrawingPanel = panel;
        //I don't want the button to be enabled in the beginning.
        setEnabled(false);
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        myDrawingPanel.undo();
        boolean canUndo = myDrawingPanel.canUndo();
        setEnabled(myDrawingPanel.canUndo());            
    }
}

这是我初始化撤消按钮的地方

new JButton(new UndoAction("Undo", myDrawingPanel)

以及绘图面板中的相关代码.java

public boolean canUndo() {
    //if there are no shapes left in shapes drawn, you cannot undo 
    return !myShapesToDraw.isEmpty();
}
  public void undo() {
    myUndoShapes.push(myShapesToDraw.remove(myShapesToDraw.size() - 1));
    repaint();
}

当我添加形状并继续删除它时,撤消按钮保持启用状态。我一直在尝试调试这个,但就是想不通。我在旁边放了一个断点

boolean canUndo = myDrawingPanel.canUndo();

看到当我按下撤消按钮并逐步执行代码时,它的计算结果为 false。但该按钮仍保持启用状态。更奇怪的是,如果我添加 2 个形状并将它们都删除,撤消按钮可以完全禁用自己。有谁知道这个问题可能是什么?

我认为导致问题的原因是,当我使用操作构建按钮时,我做了类似的事情

JButton button = new JButton(new UndoAction(.....));

后来在我的代码的某些部分,我调用了

button.setEnabled(true);

我不确定按钮上的 setEnabled 如何影响操作启用状态,但在我确保所有受影响的状态的调用都来自 Action 类后,我设法解决了我的问题。

相关内容

最新更新