Конвертировать JPanel в изображение - PullRequest
15 голосов
/ 29 августа 2009

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

спасибо,

Jeff

Ответы [ 4 ]

28 голосов
/ 29 августа 2009

Из BufferedImage вы можете создать графический объект, который вы можете использовать для вызова рисования на 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);
    g.dispose();
    return bi;
}

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

4 голосов
/ 29 августа 2009

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

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);
    g.dispose();
    return bi;
}

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

        if (component instanceof Container) {
            for (Component child : ((Container) component).getComponents()) {
                layoutComponent(child);
            }
        }
    }
}
2 голосов
/ 03 сентября 2013

Ответ от Тома в основном правильный, но вызывать paint() напрямую не рекомендуется, так как это синхронный вызов, который может прерывать другие операции в колебательном потоке. Вместо использования paint() мы должны использовать 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);
    g.dispose();
    return bi;
}
0 голосов
/ 29 августа 2009

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

...