2009-08-28 18 views
13

¿Hay alguna manera de convertir un JPanel (que aún no se ha visualizado) en una Imagen Buffered?Conversión de JPanel a la imagen

gracias,

Jeff

+0

Bueno, me rindo. Te he dado dos respuestas en tus últimas dos publicaciones que ignoras por completo. Buena suerte con publicaciones futuras. – camickr

+0

Aprecio las respuestas y no las he estado ignorando. En esta publicación, ScreenImage no era exactamente lo que estaba buscando y este método de simplemente pintar en otros gráficos parecía ser la dirección correcta para mí. En la publicación del cuadro de diálogo, resultó ser un problema y me han inundado así que no he estado respondiendo a todo. Aprecio tus respuestas. –

Respuesta

23

Desde el BufferedImage puede crear un objeto gráfico, que se puede usar para llamar a la pintura en el JPanel, algo así como:

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; 
} 

Es posible que necesite asegúrese de establecer el tamaño del panel primero.

+0

agradable, gracias. ¿Hay alguna manera de averiguar cuál debe ser el tamaño del panel (tal vez su tamaño preferido)? –

+0

Creo que es el tamaño preferido o el tamaño actual, siempre que ya se haya procesado. Hay problemas si todavía no se ha procesado: no recuerdo las especificaciones exactas, pero recuerdo haber encontrado propiedades similares al implementar un sistema de impresión. – aperkins

+0

Sí, el tamaño preferido funciona, pero como dijiste, no aparece si aún no se muestra el panel, lo que realmente no me ayuda demasiado. ¿Hay alguna manera de "renderizarlo" pero no mostrarlo en la pantalla? Básicamente estoy construyendo un componente que necesita ser escrito en una imagen pero no se muestra. –

2

Básicamente estoy construyendo un componente que necesita para que se escriba a una imagen pero no se muestra

ScreenImage explica cómo hacer lo que quiere.


Sección pertinente de ScreenImage.java (ligeramente editada). layoutComponent fuerza todos los botones aparecen en la imagen.

/** 
* @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); 
      } 
     } 
    } 
} 
0

Eche un vistazo a BasicTableUI. El renderizador de celda se dibuja en la imagen sin mostrar y luego se dibuja en el componente de tabla visible.

0

La respuesta de Tom es básicamente correcta, pero no se recomienda invocar paint() directamente, ya que es una llamada síncrona y puede interrumpirse con otra operación en el hilo de columpio. En lugar de utilizar paint(), debemos utilizar print() lugar

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; 
} 
1

estoy de acuerdo. JPanel.print() es mejor. JPanel.paint() conduce a un error en mi aplicación.

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; 
}