Расширяет JFrame и создает его внутри программы

При создании приложения с использованием Swing я видел, как люди делали одну из двух вещей, чтобы создать JFrame. Какой подход лучше и почему?

Я новичок в Java и программировании. Моим единственным источником обучения являются книги, YouTube и переполнение стека.

import {imports}; public class GuiApp1 { public static void main(String[] args) { new GuiApp1(); } public GuiApp1() { JFrame guiFrame = new JFrame(); guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiFrame.setTitle("Example GUI"); guiFrame.setSize(300,250); ................ } 

А ТАКЖЕ

 import {imports}; public class GuiApp1 extends JFrame { public Execute() { getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600); ............. } public static void main(String[] args) { Execute frame1 = new Execute(); frame1.setVisible(true); } } 

Мысли:

  • Избегайте расширения JFrame, поскольку он связывает ваш GUI с тем, чтобы быть, хорошо JFrame. Если вместо этого вы концентрируетесь на создании JPanels, тогда у вас есть свобода использовать эти JPanels где угодно – в JFrame или JDialog, или JApplet, или внутри другого JPanel, или заменена на другие JPanels через CardLayout.
  • Избегайте наследования в целом, особенно сложных classов. Это предотвратит пагубные ошибки, такие как непреднамеренные переопределения методов (попробуйте создать JFrame или JPanel, у которых есть getX() и getY() чтобы понять, что я имею в виду!).
  • Избегайте наследования сложных classов, если вы используете среду IDE: если вы переопределяете сложный class, когда вы вызываете методы на объектах этих classов, у вас будет много или слишком много вариантов предлагаемых вами методов.
  • Инкапсуляция хорошая, есть и позволяет создавать более безопасный код. Выставляйте только то, что нужно разоблачить, и контролируйте это воздействие как можно больше.

Предпочитают состав над наследованием .

Второй пример использует наследование, но не без оснований, поскольку он не меняет функциональность JFrame .


В стороне, если это примеры кода, который вы видите, найдите новый источник 1 . Даже в нескольких приведенных кодовых строках каждый делает очень сомнительные вещи. НАПРИМЕР

  1. Ни один графический интерфейс пользователя не создается в streamе отправки событий.
  2. getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • Первая часть 1-й строки ( getContentPane() ) не нужна, так как Java 1.5
    • Во второй строке используется null макет, который будет разбит на другие способы, которыми я могу рассчитывать или описывать.
    • Третью строку лучше всего заменить на pack();
  3. JFrame guiFrame = new JFrame(); guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiFrame.setTitle("Example GUI"); guiFrame.setSize(300,250);
    • Первая и третья строки могут быть заключены в контракт:
      JFrame guiFrame = new JFrame("Example GUI");
    • Вторая строка лучше задана для guiFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    • Третья строка снова задает размер кадра.

дополнение

  1. Вы упомянули, что вы ищете SO, вот подсказка. Просмотрите сообщения из 15 лучших поставщиков ответов среди пользователей Swing . Независимо от того, какой совет / код вы получите от этих людей, будет совершать мало, если какие-либо ошибки в этих образцах кода.

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

Лично, первый подход (создание экземпляра JFrame ) является предпочтительным, я предпочитаю это, потому что …

Он не блокирует ваше приложение в выделенном контейнере … вы видите, что многие люди хотят добавлять апплеты к фреймам и фреймам к апплетам, если бы они просто поставили большинство из них GUI в JPanel для начала, они бы У меня эти проблемы.

Это также означает, что создаваемый пользовательский интерфейс намного более гибкий. Например, вы можете повторно использовать его, как в текущем приложении, так и в будущих приложениях, вы не запираетесь.

Основная проблема, с которой я сталкиваюсь с расширением JFrame заключается в том, что вы на самом деле не добавляете никаких новых функций или функциональных возможностей, которые можно было бы эффективно использовать заново, используя setVisible

Другая проблема, с которой я сталкиваюсь с расширением JFrame – это люди, которые затем быстро переопределяют paint , что действительно очень плохо. Есть так много проблем с этим, это просто больно, чтобы их неоднократно перечислить …

Итак … за 2 цента стоит. Создайте экземпляр JFrame и добавьте в него свой контент. При необходимости создайте static вызов метода showMyAwesomeGUI который сделает это за вас …

Первый подход лучше.

Как правило, вы не добавляете никаких новых функций в фрейм, поэтому создание прямого экземпляра classа имеет смысл.

Пойдите для первого подхода.

Потому что с этим вы можете создать больше фреймов. Потому что приложение может иметь более одного windows. Как и во втором случае, вы не можете создавать больше кадров.

Это не имеет значения.

Есть причины, по которым вы можете сделать то или другое, но ни одна из этих причин не имеет никакого значения.

Теперь, если вы пишете что-то, что может работать из командной строки или может быть программой GUI, очевидно, вам может понадобиться «основной» class, который не был бы графическим интерфейсом.

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

Interesting Posts
Давайте будем гением компьютера.