基本上,我正在制作一个允许您绘制形状的应用程序。我正在开发一项允许您"撤消平局"的功能。所有绘图都在绘图面板上进行。我得到了撤消的算法部分,移动到堆栈....,但是在集合中没有更多形状可绘制后,我无法禁用撤消按钮。(无法再撤消)
这是我用来存储形状的两个集合
//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 类后,我设法解决了我的问题。