Используйте BufferedImage
поле изображения. У него есть метод createGraphics()
, где вы можете рисовать. Позже позвоните Graphics.dispose()
, чтобы очистить ресурсы.
Затем в paintComponent
проверьте доступность изображения для его отображения.
Рендеринг может быть выполнен в Future, SwingWorker или любом другом , Вы правы в том, что тяжелые операции никогда не должны выполняться в paintComponent
, особенно потому, что они могут вызываться повторно.
Лучше запустить рендеринг в конструкторе или в вашем контроллере.
BufferedImage image = new BufferedImage(getWidth(), getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
try {
pdfRenderer.renderPageToGraphics(pageNumber, g2, (float) scale, (float) scale);
} finally {
g2d.dispose();
}
Первоначально ширина и высота не заполнены, поэтому лучше использовать ширину и высоту из PDF. Также не то, что Graphics2D позволяет масштабировать; Вы можете легко добавить масштабирование.
Как атомарно обрабатывать прохождение отрендеренного изображения, вероятно, понятно.