Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > как корректно прибить JInternalFrame ?


Автор: SATYR 22.4.2009, 18:44
Всем привет .

Народ вопрос следующий, действительно ли при закрытие JInternalFrema-ов методом doDefaultCloseAction при setDefaultCloseOperation установленной в DISPOSE_ON_CLOSE происходит уничтожение объекта? 
С прашиваю об этом в связи с тем что наблюдаю следующую неприятную для себя ситуацию, после закрытия JInternalFrame-ов расположенных на слоённой панели ( все фреймы располагаютя в одном слое) getComponentCountInLayer(int layer) возвращает тоже значение что было  до их закрытия.
Поэтому предполагаю что ссылки на фреймы остались внутри JLayeredPane и фреймы как таковые неуничтожены. 
Незнаю насколко это коректно , но попытался принудительно удалить закрытые  фреймы из панели методом remove(Component), после чего при попытки вызвать  getComponentCountInLayer(int layer)  пррограмма вавыливается в отладчике в EventDipatchThread.

Подскажите как удалить их коректно, ломаю голову уже три дня.

Автор: ecologist 23.4.2009, 08:58
Обычно фрейм закрывается и уничтожается методом dispose();

А ты как делаешь ?

Автор: goodday1941 23.4.2009, 10:11
Цитата(SATYR @  22.4.2009,  18:44 Найти цитируемый пост)
Народ вопрос следующий, действительно ли при закрытие JInternalFrema-ов методом doDefaultCloseAction при setDefaultCloseOperation установленной в DISPOSE_ON_CLOSE происходит уничтожение объекта? 

теоретически да

и еще вместо doDefaultCloseAction  можно использовать setClosed ...  эффект тот же будет

Автор: SATYR 23.4.2009, 13:44
Я к сожалению делал иначе через doDefaultCloseAction.  dispose() оказалось то что надо. Спасибо smile

Автор: SATYR 23.4.2009, 15:29
Я извиняюсь, но проблема осталась. При вызове любого из методов:  dispose(), doDefaultCloseAction, setClosed(true) картина прежняя  и ещё выяснилось что при вызове dispose() окно закрывается без оработки события InternalFrameEvent что в моем случае не очень хорошо. 
После удаления объекта из JLayeredPane методом remove(Component) если изъявить желание узнать колличество оставшихся окошек посредством getComponentCountInLayer(int layer)  программа вавыливается в отладчике в EventDipatchThread. 

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

Закрытие фрейма происходит по щелчку мыши на его области т.е. в слушателе событий мыши вызывется dispose() // doDefaultCloseAction()// setClosed(true),
далее в слушателе событий фрейма  (InternalFrameEvent) в методе InternalFrameClosing отслеживается  колличество оставшихся окошек посредством getComponentCountInLayer(int layer) как правило после закрытия оно не меняется. smile  если тамже пробуем либо в обработчике мыши пробуем remove то валится в  EventDipatchThread. Вот такие пироги. smile smile

Добавлено через 5 минут и 48 секунд
to goodday1941

В том то и дело что эффекта ненаблюдается

Автор: aleksandy 24.4.2009, 09:00
Код приведи, чего-то ты не так делаешь. smile

Автор: SATYR 24.4.2009, 13:21
Привожу код

Код

package analitic_alert1;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import java.util.Vector;

import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.WindowConstants;

import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;


public class AlertWindow extends JInternalFrame implements InternalFrameListener{
  private JLayeredPane pane;
  private Vector array_windows=null; //Вектор хранит ссылки на уже созданные окна
  private Mouse mouse=new Mouse();
  private Point pp=new Point(); 
  private int pos=0; 
 .....


  public AlertWindow( JLayeredPane pane,Vector array, Point p, Dimension area,int minutes) {
               this.pane=pane;
        
   addInternalFrameListener(this);
   addMouseListener(mouse);

    .....
   pack();        
               
  ....
   //Вычисляем координаты окна
   array_windows=array;
   if(array_windows.toArray().length!=0){
      AlertWindow  alwRef=(AlertWindow)array_windows.lastElement();

      pp=alwRef.getLocation();
      pp.y+=22;
      if((getPreferredSize().getHeight()+pp.y)>area.getHeight()){
         pp.y = p.y;
         pp.x+=64;
         if((getPreferredSize().getWidth()+pp.x)>area.getWidth())pp.x=p.x;
      }
      setLocation(pp);
   }
   else{pp.setLocation(p);}
   setLocation(pp);
   setVisible(true);

   setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
   main.frame.pSound.play(); // запускаем звук
   array_windows.add(this);
   pane.add(this, 0);
   try { setSelected(true);}
   catch (PropertyVetoException ex1) {}
  }

 .... 

  public void internalFrameClosed(InternalFrameEvent e) {}
  public void internalFrameClosing(InternalFrameEvent e) {

    int index=array_windows.indexOf(this)-1;
    array_windows.remove(this);
// если тут попробовать ((JLayeredPane)getParent()).remove(this); то вывалится в EventDipatchThread
    int gg=((JLayeredPane)getParent()).getComponentCountInLayer(0);
    if(index!=-1){
       AlertWindow  alwRef=( AlertWindow)array_windows.elementAt(index);
       alwRef.UnLockSelect();
       alwRef.moveToFront();
       try {alwRef.setSelected(true);}
       catch (PropertyVetoException ex1) {}
    }else if(gg==1){
        main.frame.pSound.stop();
    }   
  }
 ....

/*******************************************************************************
* Слушатель мыши
*******************************************************************************/

  class Mouse implements MouseListener {

    public void mouseClicked(MouseEvent e) {
      if (e.getButton() == MouseEvent.BUTTON3 || e.getButton() == MouseEvent.BUTTON1) {
        try {setClosed(true);//dispose() //doDefaultCloseAction();}
        catch (PropertyVetoException ex) { }
      }
    }
    ....
  }
}


Автор: aleksandy 24.4.2009, 18:50
Приведенный код нерабочий. Или давай работоспособный код, либо опиши что тебе требуется...

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