[java] Переключение между окнами

stm6695895

Ситуация следующая.
Допустим, есть два исполняемых (то есть содержащих метод main) класса, наследующих Frame (то есть при создании экземпляров этих классов рисуется окошко). Пусть они называются frame1 и frame2.
Требуется следующая функциональность. Если работаем с окном frame1, при нажатии какой-нибудь клавиши, например F1, frame1 закрывается и вызывается frame2. И наоборот, если работаем с frame2, при нажатии F1 frame2 закрывается, и открывается frame1.
Я реализовал это, переопределив метод KeyPressed в классах следующим образом:
 
public void keyPressed(KeyEvent arg0)
{
switch (arg0.getKeyCode
{
case KeyEvent.VK_F1
new frame2;
this.dispose;
break;
}
}

ну и в классе frame2 аналогично, вызов frame1.
Все в общем, работает, как и хотелось, только после 10 нажатий кнопки F1 все зависает (в смысле, программа) и выдается java.lang.OutOfMemoryError exception.
В целом, понятно, что окошки не исчезают в небытие после вызова this.dispose; как мне бы хотелось, а постепенно засирают память.
Вопрос, как правильно все это дело реализовать, чтобы, грубо говоря, F1 можно было сколько угодно раз нажимать?)

katrin2201

afair hide/show так же как и везде.

stm6695895

afair hide/show так же как и везде.
во-первых, эклипс пишет, что метод show является deprecated и в знак того, что не шутит, перечеркивает все слово жирной линией :)

во-вторых, hide и show насколько я понимаю, просто убирают окошко с глаз долой, а мне бы хотелось, чтобы старый экземпляр вообще выгружался из памяти и при нажатии F1 создавался новый. В моей версии новый создается, но старый, видимо, не выгружается из памяти, раз эта память кончается.
ну и в-третьих, я, в общем, решил уже вопрос, ограничившись двумя окнами и просто подгружая в них нужные данные вместо уничтожения и создания заново самих окон (теперь мне видится предыдущий вариант довольно извращенным но все равно, принципиальный вопрос остается: как избежать переполнения памяти в случае создания-уничтожения новых экземпляров окошек? что написать вместо dispose ?

street_racer

Вместо hide/show теперь полагается использовать setVisible(false/true).

kokoc88

В целом, понятно, что окошки не исчезают в небытие после вызова this.dispose; как мне бы хотелось, а постепенно засирают память.
Вопрос, как правильно все это дело реализовать, чтобы, грубо говоря, F1 можно было сколько угодно раз нажимать?)
Вызов dispose освобождает все системные ресурсы, которые занимает окно. Тот код, который ты привёл, должен работать. Ты не сказал, откуда вылетает OutOfMemoryException, printStackTrace. Скорее всего, где-то в программе есть статические ссылки на формы или данные.

stm6695895

Скорее всего, где-то в программе есть статические ссылки на формы или данные.

в программе имеются статические переменные. они дублируются при пересоздании?

kokoc88

в программе имеются статические переменные. они дублируются при пересоздании?
Нет. Но все связанные с ними объекты не будут собраны GC. Думаю, что достаточно быстро можно решить твою проблему, если воспользоваться jprofiler - минут за пять поймёшь, что утекает, ну и пофиксишь.

stm6695895

ок, спасибо. Посмотрю, что получится.
(накоплю 500 долларов на Single License для JProfiler и посмотрю :) )

kokoc88

(накоплю 500 долларов на Single License для JProfiler и посмотрю )
А что, за evaluation period не справишься? :ooo:

stm6695895

я уже заколебался новые имейлы регистрировать, если честно :grin:
ладно, это все в порядке шутки, конечно
Оставить комментарий
Имя или ник:
Комментарий: