Scout Eclipse проверяет наличие грязных полей

Когда вы пытаетесь закрыть приложение 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?


ДОБАВИТЬ

Я ищу функцию, которая проверяет наличие грязных полей и выводит диалоговое окно сообщений, такое же, как при закрытии формы, и способ установить грязные поля или нет.

Я смотрю здесь и здесь, но все, что там описано, это то, как сохраняются значения для всплывающих сообщений, и то, как запускать эти сообщения (проверка).


person Marko Zadravec    schedule 11.02.2015    source источник


Ответы (1)


Мой первый вопрос: почему приложение RAP не задает тот же вопрос?

Я не уверен, что знаю, какое окно сообщения вы имеете в виду, но это должно быть так.


Есть несколько вопросов о несохраненных изменениях и жизненном цикле формы в Разведывательный форум Eclipse. Я думаю, вы можете найти их с помощью 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;
  }

  //...

Надеюсь, это поможет.


Я ищу функцию, которая проверяет наличие грязных полей и всплывает диалоговое окно сообщения, такое же, как при закрытии формы.

Вы говорите из этого окна сообщения, которое появляется, когда пользователь нажимает «Отмена» в форме?

Сохранить изменения

Нет конкретной функции, которую вы можете вызвать для этого. Но вы можете проверить начало функции 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() для поля, чтобы указать, содержит оно модификации или нет. Но если вы не можете поступить иначе, я не думаю, что это правильный подход для вас.

person Jmini    schedule 11.02.2015
comment
Привет, спасибо за ответ. Я вижу, что могу переопределить execIsSaveNeeded() для каждого поля. Как вызвать всплывающий вопрос? Теперь он всплывает при закрытии, но что, если я хочу сделать это при нажатии кнопки? Есть ли способ не переопределять этот метод и просто установить какое-то логическое значение при изменении...? Я вижу методы touch() и markSaved(), это то, что я ищу? - person Marko Zadravec; 12.02.2015
comment
Я добавляю вопрос. - person Marko Zadravec; 12.02.2015
comment
Я попытался дать ответ на ваш дополнительный вопрос. - person Jmini; 12.02.2015
comment
Спасибо. Это то, что я искал. - person Marko Zadravec; 12.02.2015