Я хотел получить доступ к классу Graphics, чтобы нарисовать прямоугольник, но хотел сделать это, не вызывая метод paintComponent. Является ли это возможным?Можно ли рисовать на Java с графикой без paintComponent?
ответ
Картина всегда должна выполняться методом окраски.
Самый распространенный способ - сделать обычную окраску в методе paintComponent(...)
компонента.
Другой подход заключается в «украшении» компонента с использованием класса JLayer
и реализации рисунка в методе JLayer. Прочтите раздел из учебника Swing по телефону Decorating Components Using the JLayer Class для получения дополнительной информации и примеров.
Да, возможно, так же можно покрасить в BufferedImage
(используя прямой объект Graphics
, позвонив в метод getGraphics()
).
BUT, в отличие от корпуса для BufferedImage
, поэтому для компонента может возникнуть беспорядок. Причина заключается в том, что основной код AWT/Swing ожидает, что компонент будет рисовать сам (см. Component.paint
или JComponent.paintComponent
), в то время как он (базовый код AWT/Swing) позаботится о , когда этот рендеринг должен произойти (например, прокрутка, изменение размера , и т.д).
Как таковой, если вы рисуете снаружи компонента, в любое время AWT/Swing решает: «Ну, есть какая-то новая картина/перекраска, которая будет выполнена», она будет вызывать «стандартные методы», с ожиданием вашего чертежный код есть.
Как вы рисуете его внешне, , если вы не делаете особых аранжировок, чтобы получать уведомление о ситуации с переездом «0, детали или весь« чертеж из-за пределов »будут окрашены или не окрашены вообще или все вид разной грязной ситуации.
Другими словами, если вы рисуете-с-снаружи, вам нужно написать не только код, который делает картину, но также:
- повторно реализовать кучки кода уже, реализуемых AWT/Swing, который имеет дело с обстоятельствами, когда компонент должен быть (повторно) окрашен.
- отключить как-то AWT/Swing «родной» манипуляции с живописью.
Будьте уверены, вы не хотите, чтобы (даже если вы думаете, что делать).
PS. если вы лучше объясните, зачем вам это нужно, вы можете получить более полезные предложения о том, как это сделать надлежащим образом.
На ваш вопрос может возникнуть проблема [XY Problem] (http://mywiki.wooledge.org/XyProblem), где вы спрашиваете «как исправить эту проблему с кодом», когда лучшим решением является использование другого подхода полностью , Подумайте, расскажите нам общую проблему, которую вы пытаетесь решить, а не как пытаетесь ее решить. Например, * почему * вы хотите избежать использования paintComponent? Что вы пробовали? Что не работает? –
Например, да, можно получить компонент контекста графики компонента, вызвав «getGraphics()» и рисовать с ним, но при этом вы рискуете создать нестабильные изображения и выбросить NullPointerExceptions, так как объект Graphics, полученный таким образом, не долговечны. –
кроме того, один не называет метод paintComponent(), правильно? –