Подтвердить что ты не робот

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

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

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

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);

    }
}
4b9b3361

Ответ 1

Мысли:

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

Ответ 2

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

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


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

  • Ни один графический интерфейс пользователя не создается в потоке отправки событий.
  • getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • Первая часть первой строки (getContentPane()) не нужна, так как Java 1.5
    • Во второй строке используется макет null, который будет разбит на другие способы, которыми я могу рассчитывать или описывать.
    • Третью строку лучше всего заменить на pack();
  • 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);
    • Третья строка снова задает размер кадра.

Дополнение

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

Перейдите к первому подходу.

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

Ответ 6

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

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

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

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