Вам не нужен холст или JPanel для рисования? - PullRequest
0 голосов
/ 11 июня 2018

У меня сложилось впечатление, что Canvas или JPanel были необходимы для размещения графики на JFrame, однако ранее я видел видео, в котором человек использовал краску (графика g) при расширении JFrame и не сделалпанель или холст.Если это так, то почему люди беспокоятся о создании Canvas или JPanel?

1 Ответ

0 голосов
/ 11 июня 2018

JFrame простирается от Frame, простирается от Window, простирается от Container, простирается от Component, что определяет paint.

Если этоВ таком случае, почему люди не хотят создавать Canvas или JPanel?

Чтобы ответить на этот вопрос, вам нужно лучше понять JFrame (и классы на основе окон).

Сложный

JFrame на самом деле является составным компонентом, то есть он состоит из ряда других компонентов, которые обеспечивают основную функциональность окна

JRootPane

Что это означает, если вы переопределите paint и выполните пользовательское рисование на рамке, очень возможно, что вы закрасите дочерние компоненты, или дочерние компоненты закрасят его, и из-заТо, как работает подсистема рисования, будет происходить в любое время без вызова метода рисования фрейма.

Декорации

Кадры включают декорации окон в пределах доступной области.Это означает, что «видимая» область фактически меньше, чем определенная область кадра.

По этой же причине рекомендуется использовать pack вместо setSize

Это означает, чтоесли вы переопределите paint, вы можете рисовать под художественным оформлением окна (да, это происходит постоянно, и мы устали отвечать на него)

Painting under the decorations

Снимок экрана с Как я могу установить в середине?

contentPane из JFrame позаботится об этом, как это изложено ввидимая область.

Двойная буферизация

Контейнеры верхнего уровня, такие как JFrame, не имеют двойной буферизации, поэтому даже если вы преодолеете все вышеперечисленное, вы получите обновления, которые мерцают.Конечно, вы можете «придумать» свой собственный алгоритм двойной буферизации, но в Swing (то есть JPanel) он бесплатный, поэтому зачем беспокоиться

Заблокировано в

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

С другой стороны, если вы используете JPanelВы можете добавить его в любой контейнер, когда захотите

...