0

当您尝试关闭 Swing 应用程序并更改字段中的相同值时,应用程序会询问您是否要保存更改。

我的第一个问题是为什么 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 中是如何处理的?


添加

我正在寻找检查脏字段并弹出消息对话框的功能,与关闭表单时相同,以及设置字段是否脏的方法。

我看这里这里,但它所描述的只是如何为弹出消息存储值以及如何触发此消息(验证)。

4

1 回答 1

1

我的第一个问题是为什么 RAP 应用程序不问同样的问题?

我不确定你指的是哪个消息框,但应该是这样。


Eclipse Scout 论坛中有几个关于未保存的更改表单生命周期的问题。我想你可以用谷歌找到它们。

我还花时间开始在 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;
  }

  //...

我希望这有帮助。


我正在寻找检查脏字段并弹出消息对话框的功能,与关闭表单时相同。

您是从用户单击表单中的“取消”时出现的此消息框讲话的吗?

是否要保存更改

没有可以调用的特定函数。但是您可以检查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()以指示它是否包含修改。但除非你不能这样做,否则我认为这不是你的正确方法。

于 2015-02-11T12:42:31.907 回答