2

В Swing Gui каждый компонент ссылается по своей собственной модели данных на отображение данных. Хотя они не относятся к общей модели, иногда компоненты могут быть «зависимыми» друг от друга из-за семантики программы.Шаблон для зависимости между компонентами gui

Например: если у Gui есть JToggleButton, который отображает/скрывает таблицу и другой JButton, , чей actionListener подсчитывает строки в этой таблице, последний должен быть отключен, если первый не выбран (и таблица не отображается). Действительно - предположим, что подсчет строк не видимой таблицы может привести к несогласованному состоянию. Скажем, например, что , когда таблица скрыта, actionListener JButton вызывает метод для переменной, которая установлена ​​в значение null.

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

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

Как мне кажется, может возникнуть необходимость иметь матрицу зависимостей логических значений: по одной строке для каждого возможного состояния интерфейса и по одному столбцу для каждого компонента интерфейса. матрица [я] [J] будет верно если в состоянии я компонент J должен быть отключен. и false в противном случае.

Что вы думаете об этом? Есть ли какой-либо шаблон дизайна для решения этой проблемы?

веселит

+2

Я обычно использую шину событий для этих проблем. Они допускают слабосвязанный код - участвующие стороны не должны знать друг о друге, а сами события. Я использовал тот, который предлагает Google Guava, а также MBassador. Я бы сказал, что массивную матрицу 'boolean' лучше избегать. –

ответ

0

Я не полностью уверен, что вы имеете в виду ваше «состояние I», как общие или бетонное это. В некоторых ситуациях вы можете использовать простой вспомогательный объект, как показано ниже, и иметь экземпляр для каждого наблюдаемого состояния. Компонент, состояние которого вы зависите, не будет иметь зависимость от времени компиляции от связанных компонентов, но будет иметь ссылку на его экземпляр DependentComponents.

import java.awt.Component; 
import java.util.HashSet; 
import java.util.Set; 

/** 
* Handles components which are enabled/disabled based on some condition 
*/ 
public class DependentComponents { 
    /** 
    * Internal set of components handled by this object 
    */ 
    final private Set<Component> components = new HashSet<>(); 

    /** 
    * Each dependent component should be added to the set by this method 
    * 
    * @param component A component which is to be added 
    */ 
    public void register(final Component component) { 
     this.components.add(component); 
    } 

    /** 
    * Enables or disables all the components, depending on the value of the parameter b. 
    * 
    * @param b If <code>true</code>, all the components are enabled; otherwise they are disabled 
    */ 
    public void setEnabled(boolean b) { 
     for (Component component : this.components) { 
      component.setEnabled(b); 
     } 
    } 
} 
Смежные вопросы