Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Создание панелей по меняющимся именам


Автор: nimus 26.8.2003, 03:33
Привет всем!
Вопрос: я имею ряд динамически меняющихся названий классов в виде строк (читаю из БД). Как правило эти классы производные от JPanel. Мне надо их впихнуть на закладки TabbedPane. Проблема в том, что имен заранее не знаю, т.е. прописать переменной класс при инициализации не могу. Кто подскажет, как это можно сделать?
Или упростив задачу: имеем в каталоге апплеты ряд .class файлов. Как по вводу в тектовом поле названия класса, файл которого имеется, и подтверждении ввода нажатием кнопки, на панели апплеты именно его и открыть?
Заранее благодарен!

Автор: DarkDS 26.8.2003, 20:19
1. Нужно сделать какой либо интерфейс с классом инициализации... Или одни и тот же конструктор.
2. Далее берем переменную, в которой будет класс...
3. берем Class cl = Class.forName( className );
4. Если сделан конструктор без параметров, то делается просто:
JMyPanel panel = (JmyPanel)cl.newInstance();
иначе придется брать конструтор, и запускать тока его... Или брать метод и запускать этот метод smile.gif
Если нужно подробнее - распишу

Автор: Unregistered 26.8.2003, 22:06
Во-первых, спасибо за ответ!!
До п.3 включительно - no problem. А далее - упс... Я имею ряд классов, причём разных. Т.е. я не могу написать JMyPanel, т.к. не знаю название класса. Может это будет "TMyPanel", а может и "Tratatatatatata". Оно у меня в переменной лежит в виде строки.
Может я чего-то другое не так вытворяю, посему привожу прям кусок кода:

try {
Class cl = Class.forName(theModuleClassName);
JComponent panel = (JComponent)cl.newInstance();
}
catch(ClassNotFoundException cnfe){
System.out.println(cnfe.toString());
}
fTabbedPane.addTab(theModuleName+" (модуль "+theModuleClassName+")", null, panel);

Кричит при компиляции на последней строке вот так:
TMainCMSPanel.java:89: Undefined variable: panel

Извиняюсь за непонятливость sad.gif Можно попросить подробнее описать?

Автор: DarkDS 26.8.2003, 22:22
По поводу разных классов: Можно приводить к любомму классу-предку (к примеру к той же JPanel)
Если написаны будут тобой, то можно сделать абстрактный класс, наследованный от той же JPanel и все классы наследовать от этого класса и, соответсвенно, приводить к нему...

По поводу инициализации:
JComponent panel = null; //Нужно для видимости вне блока трай-кетч (смотри области видимости переменных)
try {
Class cl = Class.forName(theModuleClassName);
panel = (JComponent)cl.newInstance();
}
catch( Exception cnfe ){ /*Лудше ловить просто Эксепшин.. Так как newInstance может бросить эксепшин, если конструктора без параметров нет и при приведении к компоненту может быть ClassCastException*/
cnfe.printStackTrace();
System.out.println(cnfe.toString());
}
if (panel != null ) //А вдруг был эксепщин.
fTabbedPane.addTab(theModuleName+" (модуль "+theModuleClassName+")", null, panel);



Автор: Unregistered 26.8.2003, 23:43
Огромное спасибо!!! Кое-что вышло, кое-что еще хочу попробовать усложнить. Классы от панелей производные работают без проблем. С апплетами пока не выходит их сбрасывать на закладки. Но это мелочь, действительно надо выбрать один какой-то абстрактный класс и от него прыгать далее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)