Способ, которым я мог бы это сделать, - отключить все изменения в модели. Некоторый наблюдаемый бин может содержать «файл», а ваш «уровень контроллера» будет состоять из слушателей бина, которые обновляют состояния кнопок на основе наличия или отсутствия значения свойства «файл».
Это разъединяет все, так как вы можете легко добавлять дополнительные кнопки, удалять кнопки и т. Д. Без изменения вашего кода. Если у вас есть другой способ установки или очистки свойства «file», вам не нужно копировать + вставлять весь код отключения / включения.
Таким образом, в приведенном выше примере loadFile () загрузит файл и установит его для bean-компонента модели. Это изменение значения вызовет PropertyChangeEvents для ваших слушателей, которые обновляют состояние кнопки.
С моей точки зрения: дополнительная заслуга в манипулировании действиями с помощью непосредственно setEnable () кнопок. Действия могут даже быть слушателем изменения бина и просто вызывать setEnabled () для себя. Но мне нравится связывать код контроллера с реальными компонентами колебания настолько, насколько я могу сойти с рук.
Если это сбивает с толку, я могу предоставить пример кода. - хорошо, код предоставлен ...
Итак, мой "чистый" способ - это действия, поддерживающие все кнопки ... возможно, даже с общим базовым классом:
public abstract class FileRequiredAction extends AbstractAction
implements PropertyChangeListener {
public FileRequiredAction( String name ) {
super( name );
}
public void propertyChanged( PropertyChangeEvent event ) {
if ("file".equals( event.getName())
setEnabled( event.getNewValue() != null );
}
}
Затем, предположив, что у вас есть какой-то правильный компонент модели с методом setFile (), который запускает нужные события, ваш код установки пользовательского интерфейса будет выглядеть примерно так:
Action a;
a = new FileRequiredAction( "Show" ) {
public void actionPerformed( ActionEvent event ) {
// Do the showing
}
};
myBean.addPropertyChangeListener( "file", a );
JButton showButton = new JButton( a );
...repeat for other actions that require "file".
Все, что нужно сделать кнопке «Загрузить», это вызвать myBean.setFile (someNonNullValue), и кнопки активируются самостоятельно. Бонус в том, что какое-то другое действие очищает значение, которое они снова отключили.
Для полного кода я пропустил некоторые вещи, такие как проверка того, что действие инициализирует свое включенное состояние в случае, если myBean.getFile () уже имеет значение, и т. Д.
Надеюсь, это прояснит ситуацию.