Создание JFrame из другого конструктора JFrames

StackOverflow https://stackoverflow.com/questions/1263660

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть 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 и сделать его видимым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top