Создание JFrame из другого конструктора JFrames
Вопрос
У меня есть 3 объекта, которые расширяются JFrame
давай позвоним им FrameA
FrameB
FrameC
.
FrameA
это мое главное окно приложения.От FrameA
конструктор, если приложение не зарегистрировано, я создаю FrameB
и FrameC
.Это просто всплывающие окна, указывающие на пробный период.
В 2 случаях из 10 приложение зависает и никогда не показывает кадр B и C, а кадр A перестает отвечать.
Мне было интересно, есть ли побочный эффект от создания кадров таким способом?
Решение
Это потому, что вы не позволяете FrameA завершить процесс создания, вы прерываете его, а затем в том же потоке отображаете эти два других кадра.
Я бы предложил изменить вашу стратегию и использовать фабричный метод и, возможно, в сочетании с методом SwingUtilities.invokeLater.
Допустим, у вас есть что-то вроде:
public static void main( String [] args ) {
JFrame a = new FrameA(); // Has both display logic and trial "pop up" logic
}
Измените его на:
public static void main( String [] args ) {
JKFrame a = FrameA.createFrame(); // the same but splited like the following code
}
class FrameA extends JFrame {
// new method
public static JFrame createFrame() {
return new FrameA();
}
}
Ничего не изменилось, вы просто добавили фабричный метод, позже вы сможете:
public static JFrame createFrame() {
if( thatSpecialLogicSaysItIsTrialAndShouldPopUp() ) {
JFrame b = new FrameB();
b.setVisible( true );
JFrame c = new FrameC();
c.setVisible( true );
return new FrameA();
} else {
return new FrameA();
}
}
Во втором коде вы будете отделять логику от конструктора класса и помещать ее в фабричный метод.Таким образом, если thatSpecialLogicSaysItIsTrialAndShouldPopUp возвращает true, вы отображаете B и C
Вы также можете, как описано, использовать JDialog, но проблемы практически исчезнут, когда вы разделите обязанности.
Другие советы
Симптомы, которые вы описываете, похожи на то, что что-то блокирует поток событий - это может иметь или не иметь никакого отношения к тому, как вы запускаете фреймы - вам нужно запустить отладчик, и когда он начнет проявлять симптомы, проверьте состояние потока событий.
(Хотя я согласен со всеми остальными в ветке, что вам следует переместить логику запуска фрейма в какое-то другое место - однако - нет ничего "опасного" в вызове конструкторов фреймов из другого конструктора фреймов - они ничем не отличаются от любого другого конструктора.Возможно, это плохой дизайн, но он не должен блокировать поток событий.)
Вы захотите использовать JDialog.Там сделано именно это.
Вам следует подумать о своей логике.Создание новых фреймов в конструкторе другого фрейма звучит странно.Если вы делаете это в конструкторе - это означает, что первый кадр еще не показан.Почему бы вам не показать кадры B и C вне конструктора кадра A - логически это одно и то же.Но затем, в зависимости от ваших условий, вы можете создать кадр A и сделать его видимым.