Можно ли рисовать на Java с графикой без paintComponent?

#java #swing #graphics #paintcomponent #graphics2d

#java #swing #графика #paintcomponent #graphics2d

Вопрос:

Я хотел получить доступ к классу Graphics, чтобы нарисовать прямоугольник, но хотел сделать это без необходимости вызывать метод paintComponent . Возможно ли это?

Комментарии:

1. На самом деле ваш вопрос может быть проблемой XY , когда вы спрашиваете: «Как мне исправить эту проблему с кодом», когда лучшим решением является использование совершенно другого подхода. Подумайте о том, чтобы рассказать нам об общей проблеме, которую вы пытаетесь решить, а не о том, как вы сейчас пытаетесь ее решить. Например, почему вы хотите избежать использования paintComponent? Что вы пробовали? Что не работает?

2. Например, да, можно получить объект графического контекста компонента, вызвав getGraphics() и нарисовав с его помощью, но при этом вы рискуете создать нестабильные изображения и выбросить NullPointerExceptions, поскольку графический объект, полученный таким образом, не долговечен.

3. кроме того, метод paintComponent() не вызывается, верно?

Ответ №1:

Рисование всегда должно выполняться методом рисования.

Наиболее распространенным способом является выполнение пользовательского рисования в paintComponent(...) методе компонента.

Другой подход заключается в том, чтобы «украсить» компонент с помощью JLayer класса и реализовать рисование в paint(...) методе JLayer . Прочитайте раздел из учебника Swing по оформлению компонентов с использованием класса JLayer для получения дополнительной информации и примеров.

Ответ №2:

Да, это возможно, так же, как можно рисовать в a BufferedImage (используя прямой Graphics объект, вызывая getGraphics() метод).

НО, в отличие от случая BufferedImage , выполнение этого для компонента, вероятно, приведет к беспорядку. Причина в том, что базовый код AWT / Swing ожидает, что компонент будет рисовать сам (см. Component.paint Или JComponent.paintComponent ), В то время как он (базовый код AWT / Swing) позаботится о том, когда должен произойти этот рендеринг (например, прокрутка, изменение размера и т. Д.).

Таким образом, если вы рисуете извне компонента, в любой момент AWT / Swing решит «Ну, нужно выполнить какое-то новое рисование / перерисовку», он вызовет «стандартные методы», ожидая, что ваш код рисования есть.
Когда вы рисуете его внешне, если вы не принимаете специальных мер для получения уведомлений о ситуации «необходимости перерисовки», части или весь «рисунок извне» будут закрашены или не будут закрашены вообще или во всех других беспорядочных ситуациях.

Другими словами, если вы рисуете извне, вам нужно будет написать не только код, который выполняет рисование, но и:

  1. повторно реализовать кучи кода, уже реализованного AWT / Swing, который касается обстоятельств, когда компонент необходимо (повторно) нарисовать.
  2. каким-то образом отключите AWT / Swing «родную» обработку рисования.

Будьте уверены, вы этого не хотите (даже если думаете, что хотите).

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