Динамическое добавление компонентов в JPanels во время выполнения - PullRequest
2 голосов
/ 02 декабря 2011

Во время разработки программного обеспечения мне нужно выполнить оператор, который сохраняется как string. Скажем, например:

String test = " int a; ";

В приведенном выше примере я хочу объявить переменную a.

Другим примером является выполнение оператора mysql из string:

String sqlquery ="SELECT * FROM FULLDETAILS WHERE Classname = 'test' ";
            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/executable","root","mysql");
             st = (Statement) con.createStatement();
             rs = st.executeQuery(sqlquery);
                          ^

Я хочу добиться этого и для операторов Java. Есть ли способ?

РЕДАКТИРОВАТЬ:

Приведенный выше пример является примером, реальная ситуация сильно отличается (но то, что мне в основном нужно, то же самое).

Ситуация такова, что у меня есть номер jpanels, и я хочу добавить к нему некоторые компоненты, например, label, содержимое метки получено из базы данных, и это только во время выполнения, я могу знать, к какой панели я должен добавить компонент. В этом случае я не могу назначить panel по имени, скажем, если у меня есть 10 jpanels, я подумал, что мог бы использовать строку вроде:

String test = " jpanel " + i + " .add(jlabel1); " ;

приведет к тому, что значение теста будет:

jpanel1.add(jlabel1); // provided i is a string with value of i is 1

теперь я хочу выполнить это. Есть ли способ?

Ответы [ 2 ]

8 голосов
/ 02 декабря 2011

Возможно, это не то, что вам нужно, но вы можете осторожно использовать Java Reflection API для вызова методов или чего-то еще на основе (например) строк.

Операторы SQL сильно отличаются, поскольку они не выполняются внутри Java, они обрабатываются дополнительным SQL Server на другой стороне соединения JDBC.

Где-то, у вас должен быть первоначальный список всех ваших панелей или создать его при запуске или что-то другое, если я прав? Вам нужно найти и найти структуру данных для их хранения (например, HashMap кажется подходящей), добавить все панели и использовать клавишу, чтобы вернуть их и добавить метки, как вы хотите.

Грубый пример:

Map<Integer, Panel> panelMap = ...
for(int i = 1; i < 10; i++) {
    Panel panel = new Panel();
    panelMap.put(i, panel); 
}

panelMap.get(1).addLabel(labelForPanel1); (for all labels)

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

3 голосов
/ 02 декабря 2011

То, что вы хотите сделать, это что-то вроде функции eval () для Java.Насколько я знаю, Java не предоставляет такой возможности, но она поддерживает языки сценариев, поэтому вы можете вернуться к этому.

Я обнаружил вопрос в StackOverflow.Смотрите ответы там.Кроме того, проверьте JEXL .Это проект Apache, и я успешно использовал его в проекте раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...