Преобразование 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;
}