如果我绘制两个形状并撤消而不是如果我绘制一个形状并撤消,为什么按钮禁用?

时间:2014-11-19 00:45:10

标签: java jpanel action jbutton

基本上我正在制作一个允许你绘制形状的应用程序。我正在开发一个可以让你“撤消平局”的功能。所有绘图都在绘图面板上进行。我得到了算法部分的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个形状并将它们都删除,撤消按钮将自动完全禁用。有谁知道这个问题会是什么?

1 个答案:

答案 0 :(得分:0)

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

的操作
JButton button = new JButton(new UndoAction(.....));

后来在我的部分代码中,我打电话给

button.setEnabled(true);

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