Визуальное наследование в Java
Команда, в которой я работаю, испытывала проблемы с визуальным наследованием форм на платформе Java.
Мы хотим разработать базовый JFrame с некоторыми элементами управления и наследовать формы от этого базового JFrame. Разработчик Netbeans 6.1 не рисует элементы управления базовой формы в унаследованных, поэтому мы не можем использовать их так, как нам хочется. Во время выполнения унаследованные формы хорошо расписаны, с помощью родительских элементов управления.
Дизайнер Netbeans
Кто-нибудь решил это? Должны ли мы изменить IDE?
3 ответа
AFAIK, Матисс на самом деле не предназначен для создания неотъемлемых форм. Он предназначен для композиции (т.е. создайте пользовательский JComponent и поместите его в форму Matisse).
Дизайнер форм не использует Java-файл для создания формы, он использует файл "form". Это не унаследовано. Если вам абсолютно необходимо использовать наследование (что я бы рекомендовал против), вам необходимо скопировать содержимое файла "form" в ваш дочерний класс.
Как правило, вы должны создать какой-то пользовательский JPanel (с использованием Matisse или нет) и затем перетащить эту форму в свой JFrame. Любой пользовательский код / события, которые необходимо использовать повторно, должен быть присоединен к JFrame, должен быть создан в bean-компонентах и затем добавлен в форму.
Netbeans 7 рассматривает возможность обновления кода Матисса. Я бы предложил добавить это в качестве запроса на улучшение на htt p://www.netbeans.org/.
Просто общий комментарий, а не реальный ответ на вашу ситуацию - визуальные компоненты не созданы для наследования. Например, посмотрите на ужасную ошибку Sun, унаследовав все от Component- теперь у вас есть JList, в который вы не можете использовать.add() для добавления элементов. Если вы не можете выполнить весь контракт суперкласса (а я знаю только о нескольких классах, которые могут) предпочитать композицию, а не наследование. Предоставьте методы, которые вы планируете выполнить, и метод "Component getAsComponent()" с явным объявлением, что компонент не должен изменяться напрямую. Я нахожу это намного проще, чем думать о том, "что мне делать, если кто-то использует add(JLabel) для моего компонента? Или setLayout()?".
Что касается вашего конкретного затруднительного положения - я использую JFormDesigner в IntelliJ IDEA, но это также может быть применимо. JFD имеет хороший способ использования информации компонента BeanInfo (для компонента с именем "MyThingy" класс информации будет "MyThingyBeanInfo"). Используя этот класс, вы можете определить множество вещей для потребления только во время разработки, наряду со специальными методами рисования и другими тонкостями.
Jaguard, вы должны изменить контроль доступа var (щелкните правой кнопкой мыши на элементе управления, выберите "настроить код", см. Нижнюю часть окна)