2012-06-30 18 views
11

Hola quiero convertir el panel que contiene componentes como etiquetas y botones en el archivo de imagen.cómo guardar el panel como imagen en el columpio?

He realizado el siguiente código. La imagen fue guardada pero el contenido del panel no está visible o guardado. ¿Alguien puede decirme cómo guardar el panel con sus componentes?

Código:

package PanelToImage; 

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class sample extends JPanel { 

public JPanel firstpanel; 
public JPanel secondpanel; 
JLabel label1, label2; 
JButton button1, button2; 

public sample() { 
    firstpanel = new JPanel(); 
    firstpanel.setSize(400,300); 
    firstpanel.setBackground(Color.RED); 
    secondpanel = new JPanel(); 
    secondpanel.setBackground(Color.GREEN); 
    secondpanel.setSize(400,300); 

    label1 = new JLabel("label1"); 
    label2 = new JLabel("label2"); 
    button1 = new JButton("button1"); 
    button2 = new JButton("button2"); 

    firstpanel.add(label1); 
    firstpanel.add(button1); 

    secondpanel.add(label2); 
    secondpanel.add(button2); 

    saveImage(firstpanel); 

    add(firstpanel); 

    // add(secondpanel); 
} 

public static void main(String args[]) { 

    JFrame frame = new JFrame(); 
    sample sam = new sample(); 
    frame.setContentPane(sam); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 300); 

} 

private void saveImage(JPanel panel) { 
    BufferedImage img = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_RGB); 
    panel.paint(img.getGraphics()); 
    try { 
     ImageIO.write(img, "png", new File("E://Screen.png")); 
     System.out.println("panel saved as image"); 

    } catch (Exception e) { 
     System.out.println("panel not saved" + e.getMessage()); 
    } 
} 
} 
+0

Ver [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) para la visualización de los componentes visibles - para desplazarse hacia abajo ** ** Véase también y una clase por Rob Camick que toma una Gran parte del gruñido funciona al tomar una imagen de un componente que no se ha mostrado. Y algunos de los otros trucos para renderizar componentes antes de la visualización se pueden ver en [¿Por qué el encabezado JTable no aparece en la imagen?] (Http://stackoverflow.com/q/7369814/418556) –

+1

Me parece que eres proporcionando la "Ruta" incorrecta para que se cree el archivo. Dado que su Programa no sabe nada de lo que es 'Drive E', entonces el nuevo' Archivo' que se creará debe estar referenciado con 'Relative Path' con respecto al' .class File', como '.. \. . \ E: \ Screen.png', haciendo que suba dos niveles y luego llegue a 'Drive E', algo así funcionará. La imagen así creada con mi respuesta o la respuesta de @Alberto se crea al lado del archivo .class. –

Respuesta

17

código Lla funciona para mí (en el JFrame):

Container c = getContentPane(); 
BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); 
c.paint(im.getGraphics()); 
ImageIO.write(im, "PNG", new File("shot.png")); 

paneles personalizados Tal vez que ha utilizado. Si es verdadero, intente agregar super.paint(g) al comienzo de los métodos paint de sus paneles.

EDITAR: Tienes que llamar saveImagedespués pantalla del marco:

public static void main(String args[]) { 
    ... 
    frame.setSize(400, 300); 
    sam.saveImage(sam.firstpanel); 
} 

EDIT 2: Esta es la imagen guardada (es poco porque la disposición, sino que es la prueba de que se debería funcionar):

enter image description here

que se llama el saveImage como última llamada en el main, y utilizó un archivo en el directorio de usuario (new File("Screen.png")) como nIcE cOw dijo.

+0

no estoy usando el método de pintura. Solo estoy usando el panel y agrego componentes con él. Pero los componentes no son visibles al guardar el panel en la imagen. –

+0

Ver mi edición. Tienes que llamar a saveImage luego de que se muestre el marco. – Alberto

+0

Consulte [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) para ver los componentes visibles - desplácese hacia abajo para ** Consulte también ** & Una clase de Rob Camick que requiere mucho trabajo. de tomar una imagen de un componente que no se ha mostrado. Y algunos de los otros trucos para representar componentes antes de la visualización se pueden ver en [¿Por qué el encabezado JTable no aparece en la imagen?] (Http://stackoverflow.com/q/7369814/418556) –

5

Aquí pruebe este programa de ejemplo, en lugar de usar getGraphics(), parece que tiene que usar createGraphics() para el que está a punto de hacer.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class SnapshotExample 
{ 
    private JPanel contentPane; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Snapshot Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     contentPane = new JPanel(); 
     contentPane.setOpaque(true); 
     contentPane.setBackground(Color.WHITE); 
     JLabel label = new JLabel("This JLabel will display" 
         + " itself on the SNAPSHOT", JLabel.CENTER); 
     contentPane.add(label); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

     makePanelImage(contentPane); 
    } 

    private void makePanelImage(Component panel) 
    { 
     Dimension size = panel.getSize(); 
     BufferedImage image = new BufferedImage(
        size.width, size.height 
           , BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = image.createGraphics(); 
     panel.paint(g2); 
     try 
     { 
      ImageIO.write(image, "png", new File("snapshot.png")); 
      System.out.println("Panel saved as Image."); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      {   
       new SnapshotExample().displayGUI(); 
      } 
     }); 
    } 
} 
+0

Ver [ComponentImageCapture.java] (http: // stackoverflow.com/a/5853992/418556) para mostrar los componentes visibles - desplácese hacia abajo para ** Consulte también ** & A clase de Rob Camick que elimina una gran parte del trabajo de sacar una imagen de un componente que no se ha mostrado. Y algunos de los otros trucos para renderizar componentes antes de la visualización se pueden ver en [¿Por qué el encabezado JTable no aparece en la imagen?] (Http://stackoverflow.com/q/7369814/418556) –

+0

@AndrewThompson: Gracias por Estos valiosos enlaces, yo había visto esa última pregunta, una vez antes, cuando recién comencé a aprender "Painting in Swing", aunque todo ese asunto se me pasó por la cabeza en ese momento. Pero esta vez espero poder aprender cargas de estos ejemplos :-). Gracias de nuevo. Aclamaciones –

Cuestiones relacionadas