2013-05-05 53 views

回答

2

(從G +後擴展討論)

的一點想法,你可能會考慮:

  • 安慰劑保存按鈕不是一個可怕的想法。在對話框中,'保存'通常意味着'保存並關閉',這意味着它可能在'取消和關閉'類型按鈕旁邊 - 如果沒有更改,效果將是相同的。只有代碼需要知道在沒有變化的情況下是有區別的。在文檔中,「保存」只是刷新所有最近更改的方法,再次,按鈕後面的代碼可以忽略它。允許用戶指導軟件保存超過必要的內容可能不是一件壞事,那麼...
  • 編輯器框架的構建目的是允許訪問者遍歷驅動程序知道的編輯樹。這將使你能夠建立一個訪問者,如果它實現HasValueChangeHandlers,可以詢問樹中的每個編輯器,如果是,則添加一個處理程序。但是...
  • 當窗口小部件在邏輯上經歷了更改並具有新值時,ValueChangeEvents熄滅。這些更改幾乎總是在用戶模糊不在字段時纔會發生 - 如果光標仍然位於用戶修改的唯一文本框中,並且用戶將鼠標懸停在保存按鈕上,它仍然會模糊不清,因爲沒有ValueChangeEvent發生。您需要等待他們離開現場,或輪詢活動字段以查看它是否具有新值,或詢問司機是否髒。請注意,不是所有的小部件都會輪詢得很好 - 有些小部件在仍然集中時沒有可用值(例如任何CellWidget),而另一些不瞭解isDirty()(如HasDataEditor)。

實例編輯遊客尋找HasValueChangeHandlers

driver.accept(new EditorVisitor(){ 
    @Override 
    public <T> void endVisit(EditorContext<T> ctx) { 
    Editor<T> ed = ctx.getEditor(); 
    if (ed instanceof HasValueChangeHandlers) { 
     @SuppressWarnings("unchecked") 
     HasValueChangeHandlers<T> hasHandlers = (HasValueChangeHandlers<T>) ed; 
     hasHandlers.addValueChangeHandler(new ValueChangeHandler<T>() { 
     @Override 
     public void onValueChange(ValueChangeEvent<T> event) { 
      // TODO update button 
      // consider comparing event.getValue() with ctx.getFromModel() 
      // though that requires seeing which editors have changes... 
     } 
     }); 
    } 
    } 
}); 

實例輪詢更改:

Timer t = new Timer(){ 
    @Override 
    public void run() { 
    boolean hasChanges = driver.isDirty(); 
    // TODO update button with the hasChanges value 
    } 
}; 
t.schedule(500); 
// Don't forget to cancel() this when done, both on save and cancel! 
相關問題