基本上我正在制作一个允许你绘制形状的应用程序。我正在开发一个可以让你“撤消平局”的功能。所有绘图都在绘图面板上进行。我得到了算法部分的undo down,移动到堆栈....,但是在没有更多的形状要在集合中绘制之后我无法取消撤销按钮。(不能再撤消)
这是我用来存储形状的两个系列
//to store shapes that have been drawn
private final List<ShapeColorThickness> myShapesToDraw
//store shapes that have been "undone"
private final Stack<ShapeColorThickness> myUndoShapes;
这是用于处理撤消按钮点击的AbstractAction类。
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)
DrawingPanel.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();
}
当我添加一个Shape并继续删除它时,撤消按钮保持启用状态。我一直试图调试这个,但只是无法弄清楚。我在
旁边放了一个断点boolean canUndo = myDrawingPanel.canUndo();
当我按下撤销按钮并逐步执行代码时,看到它被评估为false。但按钮仍然保持启用状态。甚至更奇怪的是,如果我添加2个形状并将它们都删除,撤消按钮将自动完全禁用。有谁知道这个问题会是什么?
答案 0 :(得分:0)
我认为导致问题的原因是,当我使用动作构建按钮时,我做了类似
的操作JButton button = new JButton(new UndoAction(.....));
后来在我的部分代码中,我打电话给
button.setEnabled(true);
我不确定按钮上的setEnabled如何影响操作启用状态,但在确定所有影响状态的调用来自Action类之后,我设法解决了我的问题。