2015-02-11 107 views
0

當您嘗試關閉Swing應用程序並在字段中更改相同的值時,應用程序會詢問您是否要保存更改。Scout Eclipse檢查髒字段

我的第一個問題是爲什麼RAP應用程序不會提出相同的問題?

第二個也是更重要的問題是如何強制驗證字段更改以及如何操作。

例如:

我有表中的行和表下面的一些字段。如果我點擊行,某些值將輸入到字段中。我可以更改此值並單擊按鈕保存。

我想強制點擊行更改驗證。所以如果應用更改工具,並且如果我點擊行,應用程序應該警告我有些更改未保存。 但我應該能夠操縱什麼是變化,什麼不是。例如,如果表中的行點擊填充一些數據,如果字段這不是更改,但如果我輸入值是相同的字段,這是變化。

我發現方法

checkSaveNeeded(); 

但不起任何作用。 (如果我更改值與否)

我看到每一個領域已經馬託

@Override 
public final void checkSaveNeeded() { 
    if (isInitialized()) { 
     try { 
     propertySupport.setPropertyBool(PROP_SAVE_NEEDED, m_touched || execIsSaveNeeded()); 
     } 
     catch (ProcessingException e) { 
     SERVICES.getService(IExceptionHandlerService.class).handleException(e); 
     } 
    } 
    } 

所以我應該改變操作扔m_touched?

這在Scout中如何處理?


ADD

我找的是那個檢查髒數據的字段和彈出消息框,同樣關閉窗體時,和方法來設置字段髒或不作爲的功能。

我看herehere,但它所描述的是如何存儲彈出消息的值和點如何觸發此消息(驗證)。

回答

1

我的第一個問題是爲什麼RAP應用程序不會提出相同的問題?

我不確定知道哪個消息框是你的意思,但它應該是這種情況。


大約有未保存的更改並在Eclipse Scout Forum形式的生命週期幾個問題。我想你可以用Google找到它們。

我也借這個時候開始在Eclipse的Wiki來記錄它:

我想你應該實現在相應的領域execIsSaveNeeded()AbstractTableField中的默認實現使用行的狀態,但您可以想象您想要的邏輯。

@Order(10.0) 
public class MyTableField extends AbstractTableField<MyTableField.Table> { 

    @Override 
    protected boolean execIsSaveNeeded() throws ProcessingException { 
    boolean result; 
    //some logic that computes if the table field contains modification (result = true) or not (result = false) 
    return result; 
    } 

    //... 

我希望這會有所幫助。


我找的是那個檢查髒數據的字段和彈出消息框,同樣收盤時形成的功能。

你是否從這個消息框中發言,當用戶單擊表單中的Cancel時出現?

Do you want to save the changes

沒有,你可以調用該特定功能。但是您可以檢查AbstractForm.doCancel()函數的開頭。這正是你正在尋找的。

我已經改寫這樣的:

// ensure all fields have the right save-needed-state 
checkSaveNeeded(); 
// find any fields that needs save 
AbstractCollectingFieldVisitor<IFormField> collector = new AbstractCollectingFieldVisitor<IFormField>() { 
    @Override 
    public boolean visitField(IFormField field, int level, int fieldIndex) { 
    if (field instanceof IValueField && field.isSaveNeeded()) { 
     collect(field); 
    } 
    return true; 
    } 
}; 
SomeTestForm.this.visitFields(collector); 

MessageBox.showOkMessage("DEBUG", "You have " + collector.getCollectionCount() + " fields containing a change in your form", null); 

我已經改變了觀衆收集與不變,改變所有值字段。但你可以堅持原來的visitField(..)實施。您不能使用P_AbstractCollectingFieldVisitor,因爲它是私密的,但您可以在其他地方有類似的現場訪問者。

我正在尋找一種方法來設置字段髒或不。

正如我告訴你:execIsSaveNeeded()在每個領域的一些自定義邏輯。您也可以在字段上撥打touch()/markSaved()以表明它包含修改或不修改。但除非你不能這樣做,否則我不認爲這是你的正確方法。

+0

嗨,謝謝你的回覆。我發現我可以在每個字段上覆蓋execIsSaveNeeded()。如何觸發彈出式問題?現在它在接近行動時彈出,但是如果我想在按鈕點擊時做什麼呢?有沒有辦法不重寫此方法,只是設置一些布爾值,因爲它是改變...?我看到方法touch()和markSaved(),這是我在找什麼? – 2015-02-12 09:38:59

+0

我添加了一些問題。 – 2015-02-12 14:53:22

+0

我試圖爲您的其他問題提供答案。 – Jmini 2015-02-12 16:42:32