2015-02-11 78 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