Я знаю, что это довольно легко сделать, но мой случай сложен, потому что я создаю его объект во время выполнения, как я могу это сделать.
Нет ничего волшебного во время выполнения, которое делаетэто отличается от того, как вы обычно закрываете его.Секрет в том, чтобы ссылка на JInternalFrame была легко доступна.Решение состоит в том, чтобы использовать поле JInternalFrame, нестатическую переменную экземпляра, для хранения ссылки и не использовать переменную local , как вы это делаете в настоящее время.Ключевым моментом здесь является понимание того, что ссылки важны гораздо больше, чем переменные.Если вам нужна ссылочная переменная, которая сохраняется после завершения метода, тогда переменная не может быть объявлена внутри метода, но должна быть в масштабе класса.
Что-то вроде:
public class MyGui {
// instance field to hold reference to currently displayed JInternalFrame
private JInternalFrame currentInternalFrame = null;
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
if (currentInternalFrame != null) {
currentInternalFrame.dispose(); // clear current one
}
String st = TextField.getText().toString(); // in TextField i enter the JInternal Frame Name
String clazzname = "practice."+st; // practice is the package name
try {
// JInternalFrame obj1 = (JInternalFrame) Class.forName( clazzname ).newInstance();
currentInternalFrame = (JInternalFrame) Class.forName( clazzname ).newInstance();
currentInternalFrame.setVisible(true);
jPanel1.add(currentInternalFrame);
} catch(Exception e) {
System.out.println("error "+e);
}
}
}
Обратите внимание, что этоКод не был протестирован и не предназначен для решения копирования и вставки, но дает общее представление.
Еще одна не связанная с этим проблема связана с дизайном программы: пользователям обычно не нравится, когда окна открываются и закрываются, и, возможно, лучшей структурой программы для вашего пользователя является замена представлений JPanel через CardLayout (см. CardLayoutУчебное пособие (подробнее об этом).