2012-09-21 81 views
2

我在我的Swing應用程序中使用UndoManager。 如果在UndoManager上調用undo(),redo(),addEdit()或其他方法,最終必須啓用或禁用撤銷和重做按鈕。撤消管理器的觀察

我找不到在這些方法調用中作出反應的方法。似乎沒有爲此目的實施Observer或Listener模式。

每次調用UndoManager方法時,都要更新Undo和Redo按鈕的啓用屬性......這不是最佳實踐?!

一個例子:

  • 編輯>插入件 - 增加一個編輯到的UndoManager
  • 編輯>切 - 增加一個編輯到的UndoManager

在兩種情況下,撤銷按鈕必須啓用(如果它尚未)。 我需要一種方式來反應所有這些在UndoManager的變化!

+0

也許有比子類的UndoManager並添加兩個方法,沒有更好的辦法:'addHistoryChangeListener(聽衆)'和'removeHistoryChangeListener(聽衆)'。每當'UndoableEdit'列表發生變化時,監聽器都會被通知。這樣我可以反應,並啓用或禁用撤消/重做按鈕。 – schoettl

回答

1

您可以將偵聽器添加到撤消和重做按鈕。 UndoManager不知道你用什麼Swing組件來撤銷或重做。

下面是一個snippet顯示了一個撤消按鈕的按鈕監聽器。

// Add a listener to the undo button. It attempts to call undo() on the 
// UndoManager, then enables/disables the undo/redo buttons as 
// appropriate. 
undoButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent ev) { 
    try { 
     manager.undo(); 
    } catch (CannotUndoException ex) { 
     ex.printStackTrace(); 
    } finally { 
     updateButtons(); 
    } 
    } 
}); 

    // Method to set the text and state of the undo/redo buttons. 
    protected void updateButtons() { 
    undoButton.setText(manager.getUndoPresentationName()); 
    redoButton.setText(manager.getRedoPresentationName()); 
    undoButton.getParent().validate(); 
    undoButton.setEnabled(manager.canUndo()); 
    redoButton.setEnabled(manager.canRedo()); 
    } 
+0

謝謝;但很抱歉,你誤解了我。我寧願將一個Listener添加到UndoManager。由於我的應用程序中的許多命令可能會以某種方式影響UndoManager,因此必須禁用「撤消」或「重做」按鈕。 – schoettl