Как закрыть JInternal Frame динамически при создании объекта во время выполнения - PullRequest
0 голосов
/ 23 мая 2018
  • Я открываю JInternal фрейм, получая его имя из JTextField и ** затем создаю его объект во время выполнения **, проблема в том, что если я напишу 10 раз другое имя внутреннего фрейма в textBox, а затем нажмитекнопка открывает новый JInternal кадр каждый раз.
  • Теперь я хочу, когда новый JInternal кадр открыт , предыдущий JInternalFrame должен автоматически закрываться ,
  • Я знаю, что это довольно легко сделать, но мой случай сложен, потому что я создаю его объект во время выполнения, как я могу это сделать.
  • Мой код, вот кнопкаследующий

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    
        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();
          obj1.setVisible(true);
     jPanel1.add(obj1);                // now in there i want that whenever i click the button , it check either is there any Jinternal frame is open already or not  if yes then close the previously open JFrame 
    
     }
      catch(Exception e)
      {
        System.out.println("error "+e);
     }
    
       } 
    

1 Ответ

0 голосов
/ 23 мая 2018

Я знаю, что это довольно легко сделать, но мой случай сложен, потому что я создаю его объект во время выполнения, как я могу это сделать.

Нет ничего волшебного во время выполнения, которое делаетэто отличается от того, как вы обычно закрываете его.Секрет в том, чтобы ссылка на 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Учебное пособие (подробнее об этом).

...