Визуальное наследование в Java - PullRequest
1 голос
/ 21 ноября 2008

Команда, в которой я работаю, сталкивается с проблемами визуального наследования форм на платформе Java.

Мы хотим разработать базовый JFrame с некоторыми элементами управления и наследовать формы от этого базового JFrame. Разработчик Netbeans 6.1 не рисует элементы управления базовой формы в унаследованных, поэтому мы не можем использовать их так, как нам хочется. Во время выполнения унаследованные формы хорошо расписаны, с родительским контролем.

Дизайнер Netbeans

Кто-нибудь решил это? Должны ли мы изменить IDE?

Ответы [ 3 ]

2 голосов
/ 21 ноября 2008

AFAIK, Матисс на самом деле не предназначен для создания встроенных форм. Он предназначен для композиции (т.е. создайте пользовательский JComponent и поместите его в форму Matisse).

Дизайнер форм не использует файл java для создания формы, он использует файл "form". Это не становится унаследованным. Если вам абсолютно необходимо использовать наследование (против которого я бы порекомендовал), вам необходимо скопировать содержимое файла формы в ваш дочерний класс.

Как правило, вы должны создать какую-то пользовательскую JPanel (используя Matisse или нет) и затем перетащить эту форму в свой JFrame. Любой пользовательский код / ​​события, которые необходимо использовать повторно, должен быть присоединен к JFrame, должен быть создан в bean-компонентах и ​​затем добавлен в форму.

Netbeans 7 рассматривает возможность обновления кода Матисса. Я бы предложил добавить это как запрос на улучшение на www.netbeans.org .

1 голос
/ 21 ноября 2008

Просто общий комментарий, а не реальный ответ на вашу ситуацию - визуальные компоненты не созданы для наследования. Например, посмотрите на ужасную ошибку Sun, унаследованную от Component - теперь у вас есть JList, к которому вы не можете использовать .add () для добавления элементов. Если вы не можете выполнить весь контракт суперкласса (а я знаю только несколько классов, которые могут) предпочитают композицию, а не наследование. Предоставьте методы, которые вы планируете выполнить, и метод «Component getAsComponent ()» с явным объявлением, что компонент не должен изменяться напрямую. Я нахожу это намного проще, чем думать о том, «что мне делать, если кто-то использует add (JLabel) для моего компонента? Или setLayout ()?».

Что касается вашего конкретного затруднительного положения - я использую JFormDesigner в IntelliJ IDEA, но это также может быть применимо. У JFD есть хороший способ использования информации компонента BeanInfo (для компонента с именем «MyThingy» класс информации будет «MyThingyBeanInfo»). Используя этот класс, вы можете определить множество вещей для потребления только во время разработки, а также специальные методы рисования и другие тонкости.

0 голосов
/ 04 декабря 2009

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

...