Захват тяжелых компонентов Java?

У меня есть настольное приложение с тяжелыми компонентами (JxBrowser) в JFrame. Как я могу сделать снимок из графического интерфейса и сохранить его, например, в файл PNG?

Примечание. Метод с использованием Graphics2d и Component.paint()/paintAll()/print/printAll работает только для облегченных компонентов.

Любые ответы приветствуются!

РЕДАКТИРОВАТЬ

Я уже пробовал это:

robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 

Но я хочу, чтобы внутренний компонент был захвачен...

РЕДАКТИРОВАТЬ

Кажется, что ситуация сходится к этому решению: если у меня в JFrame более тяжелый компонент, поэтому он отображается на JScrollPane, то не существует другого способа получить его снимок программно, а затем прокрутить его или сделать снимок экрана с помощью screencapture?

4 ответа

Решение

Меня зовут Роман, и я разработчик в TeamDev.

Компонент JxBrowser - это тяжелый компонент, который встраивает собственное окно Mozilla для отображения веб-страниц. Чтобы получить скриншот полной веб-страницы из компонента JxBrowser, вы действительно можете использовать функциональность Java Robot с прокруткой веб-страницы. Для небольших веб-страниц это решение подходит. Но получение скриншота большой веб-страницы займет много времени. Также обратите внимание, что Java Robot позволяет захватывать только экран. Так что если какое-то окно появится над компонентом JxBroser, то оно будет также захвачено.

Мы уже начали работать над этой функциональностью в рамках проекта JxBrowser. Решение, которое позволит захватывать полную веб-страницу, включая ее невидимую часть, основано на внутренних материалах Mozilla. Вы сможете полностью захватить веб-страницу и сохранить ее как изображение.

Мы собираемся добавить эту функциональность в один из следующих выпусков библиотеки JxBrowser, но дата выпуска еще не определена. Если вы хотите, вы можете подписаться на RSS-канал TeamDev: http://support.teamdev.com/blogs/feeds/tags/company_news

Или просто дайте мне знать, и я сообщу вам, когда эта функция будет доступна. Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы. Я буду рад помочь.

С уважением, Роман

Вы имеете в виду программно?

Как насчет

Point p = yourAwtComponent.getLocationOnScreen();
int w   = yourAwtComponent.getWidth();
int h   = yourAwtComponent.getHeight();

Rectangle rectangle = new Rectangle( p.x, p.y, w, h );

Image image = robot.createScreenCapture(rectangle);

И тогда как то так:

ImageIO.write( image, "png", file );

JxBrowser API предоставляет функциональность, которая позволяет сохранить всю веб-страницу в виде изображения в формате PNG. Пожалуйста, посмотрите образец.

Вы также можете попробовать создать скриншот, выполнив это:

    int width = frameContainer.getWidth();
    int height = frameContainer.getHeight();

    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = image.createGraphics();

    frameContainer.paint(g2);

    return image;
Другие вопросы по тегам