Преобразование JPanel в изображение

Есть ли способ конвертировать JPanel (который еще не был показан) в BufferedImage?

спасибо,

Джефф

Ответы

Ответ 1

Из BufferedImage вы можете создать графический объект, который вы можете использовать для вызова paint на JPanel, что-то вроде:

public BufferedImage createImage(JPanel panel) {

    int w = panel.getWidth();
    int h = panel.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    panel.paint(g);
    return bi;
}

Вам может потребоваться сначала установить размер панели.

Ответ 2

В основном я создаю компонент который должен быть записан на изображение но не отображается

ScreenImage объясняет, как делать то, что вы хотите.


Соответствующий раздел ScreenImage.java(слегка отредактирован). layoutComponent заставляет все кнопки отображаться на изображении.

/**
 * @return Renders argument onto a new BufferedImage
 */
public BufferedImage createImage(JPanel panel, int width, int height) {
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bi.createGraphics();
    panel.setSize(width, height); // or panel.getPreferedSize()
    layoutComponent(panel);
    panel.print(g);
    return bi;
}

private void layoutComponent(Component component) {
    synchronized (component.getTreeLock()) {
        component.doLayout();

        if (component instanceof Container) {
            for (Component child : ((Container) component).getComponents()) {
                layoutComponent(child);
            }
        }
    }
}

Ответ 3

Я согласен. JPanel.print() лучше. JPanel.paint() приводит к ошибке в моем приложении.

public BufferedImage createImage(JPanel panel) {

int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.print(g);
return bi;
}

Ответ 4

Взгляните на BasicTableUI. Средство визуализации ячеек нарисовано на изображении без отображения, а затем нарисовано на видимом компоненте таблицы.

Ответ 5

Ответ от Tom в основном правильный, но вызов paint() напрямую не рекомендуется, так как он является синхронным вызовом и может прерывать с другой работой по качающему потоку. Вместо использования paint() вместо print() следует использовать print()

public BufferedImage createImage(JPanel panel) {

int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.print(g);
return bi;
}