Шаблон для упаковки компонентов пользовательского интерфейса

77
6

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

Как я могу обрабатывать упорядочение элементов, не раскрывая подстилающую библиотеку пользовательского интерфейса?

public abstract class UIComponent {

}

public class UIPanel extends UIComponent {
private JPanel jpanel;

public UIPanel() {
this.jpanel = new JPanel();
}

public void addUIComponent(UIComponent component) {
// how can I add the concrete jbutton from a UIButton
// to the concrete jpanel of this UIPanel?
}
}

public class UIButton extends UIComponent {
private JButton jbutton;

public UIButton() {
this.jbutton = new JButton();
}
}

спросил(а) 2021-01-25T18:44:52+03:00 4 месяца, 4 недели назад
1
Решение
77

Определить метод в UIComponent

public JComponent getRealComponent();

Затем UIPanel и UIButton переопределяют метод и возвращают соответственно JPanel и JButton.

Метод должен быть таким

public void addUIComponent(UIComponent component) {
getRealComponent().add(component.getRealComponent());
}

ответил(а) 2021-01-25T18:44:52+03:00 4 месяца, 4 недели назад
64

Я сделал что-то подобное для архитектуры MVP, которую мы используем. Правило заключалось в отсутствии логики приложения в пользовательском интерфейсе и отсутствии ссылок на компоненты Swing в презентаторах. Мы достигли этого путем:

    Создание интерфейса, который реализовал GUI Swing. Ведущие столкнулись с этим интерфейсом и как он взаимодействовал с пользовательским интерфейсом.

    Использование перечислений (или строковых констант или что-то еще), которые выступали в качестве ключа для каждого поля. Пользовательский интерфейс будет регистрировать каждый компонент с указанным ключом, а Presenter затем будет действовать на пользовательский интерфейс, используя эти полевые ключи.

Код в Presenter будет выглядеть примерно так:

ui.setEditable(AddressBook.NAME, false);
ui.setValue(AddressBook.NAME, "John Doe");

Пользовательский интерфейс получит эти события и сделает JTextField для поля NAME доступным только для чтения, заполненным данным текстом.

Итак, исходя из вашего вопроса, вы хотите динамически добавлять JButtons в пользовательский интерфейс? Обычно мы этого не делали. В нашем scenerio разработчик Swing интерфейса UI уже имел бы все созданные и зарегистрированные компоненты.

Однако, если это действительно необходимо, я предполагаю, что мне нужен метод, который был подобен этому в пользовательском интерфейсе (на основе примера адресной книги):

ui.addCommandButton(AddressBook.SOME_COMMAND, "Button Text");

Или, если у вас нет ключа и вы хотите, чтобы пользовательский интерфейс генерировал новое поле динамически, может быть, что-то вроде:

Object key = ui.addCommandButton("Button Text");

ответил(а) 2021-01-25T18:44:52+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема