Расширяет 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);
}
}
Ответы
Ответ 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, очевидно, вам может понадобиться "основной" класс, который не был бы графическим интерфейсом.
Если вы работали в магазине программирования, где один или другой был стандартом, обязательно следуйте стандарту. На этот вопрос нет правильного ответа, и на самом деле очень мало выбора между ними.