Обход действия actionPerformed (), возвращающий void - PullRequest
0 голосов
/ 28 марта 2011

Я пытаюсь использовать дизайн MVC.

В модели я хотел такой метод

public boolean changeSomeData(...){
    boolean b;
    //create a dialog with an OK button
    return b;
}

Я хочу, чтобы метод возвращал значение ИСТИНА, если изменения действительно были сделаны. Изменения выполняются внутри метода actionPerformed кнопки OK.

Моя проблема в том, что я не могу написать b = true; внутри actionPerform кнопки OK, потому что я должен объявить b как final, чтобы использовать его в actionPerformed ().

Что я сделал, так это создал класс

private class MyBoolean {
    boolean b;
}

, а затем

public boolean changeSomeData(...){
    MyBoolean myBoolean;
    //create a dialog with an OK button
    actionPerformed(){
        //make changes in the data
        myBoolean.b=true;
    }
    boolean b = myBoolean.b;
    return b;
}

Но мне не нравится это решение, и я хотел знать, правильно ли оно, что я сделал, и есть ли лучшее решение. Должен ли я лучше выбросить исключение, если изменения не внесены? (например, если пользователь нажимает «отменить» вместо «ок»)

Ответы [ 3 ]

1 голос
/ 28 марта 2011

Лучший способ выполнить вашу задачу - сохранить в диалоговом окне переменную, которая указывает, было ли успешно выполнено изменение. Затем создайте метод, который ваш класс модели вызывает для извлечения значения и его возврата.

Что-то вроде:

public boolean changeSomeData(...){
    //create a dialog with an OK button
    return dialog.isSuccess();
}
1 голос
/ 28 марта 2011

В модели мне нужен такой метод ... // создать диалог с кнопкой ОК

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

Лучше было бы открыть диалоговое окно (с помощью контроллера), зарегистрировать контроллер для ActionEvent в «OK» (и, таким образом, actionPerformed), а затем внести любые измененияв этом методе.

Редактировать:

Возможно, вы захотите рассмотреть следующий грубый подход:

Представления регистрируют себя или связанные классы для модели в качестве слушателей.Всякий раз, когда модель изменяется, она запускает события, чтобы уведомить представления об изменении.

Контроллер регистрируется в представлениях и уведомляется, когда представления изменяются.Если пользователь изменяет данные, контроллер может открыть диалоговое окно и зафиксировать только изменения пользовательских сигналов «ОК».Таким образом, модель никогда не должна проверять себя, если данные должны быть изменены.Это на самом деле задача контроллера, и если контроллер передает изменения в модель, он должен применить их.

0 голосов
/ 28 марта 2011

Один из способов сделать этот код немного чище ...

public boolean changeSomeData() {

   // note that this is not a class boolean, no need to do extra autoboxing.

   boolean dataChanged = false;

   // check the old value against the new value
   // for classes

   if (oldvalue.equals(newValue)) {
      oldValue = newValue;
      dataChanged = true;
   }

   // for pimitives (built-ins)

   if (oldvalue == newValue) {
      oldValue = newValue;
      dataChanged = true;
   }

   // odds are good that the above action performed was supposed to call this
   // changeSomeData() and not the other way around.

   // if you must fire actionPerformed() when data has changed, then do so
   // like this, otherwise if it was added as part of the "solution" you can
   // skip it.

   if (dataChanged) {
      actionPeformed();
   }

   return dataChanged;
}

Обратите внимание, что этот код является Controller кодом, так как он напрямую управляет моделью и (возможно) обновляет представления.1005 *

...