2012-06-30 23 views
11

Merhaba, görüntü dosyasına etiket ve düğmeler gibi bileşenleri içeren paneli dönüştürmek istiyorum.Panoyu görüntü olarak nasıl kaydederim?

Aşağıdaki kodu yaptım. Görüntü kaydedildi. ancak panelin içeriği görünmez veya kaydedilmez. Panelin bileşenleriyle nasıl kaydedileceğini söyleyen var mı?

Kodu:

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

bakınız [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) görünür bileşenleri göstermek için - Ayrıca bkz aşağı kaydırma ** ** ve Rob Camick A sınıfı alır, bir Grunt'un birçoğu, görüntülenmemiş bir bileşenden görüntü almayı başarır. Ve göstermeden önce bileşenleri render için diğer hileler bazıları [JTable başlığı görüntüde neden görünmüyor?] (Http://stackoverflow.com/q/7369814/418556) –

+1

göründüğü göründüğü gibi görünüyor Oluşturulacak dosya için yanlış 'Yol' sağlama. Programınız “Drive E” ile ilgili hiçbir şey bilmediğinden, oluşturulacak olan yeni 'File'' '.class File' ile ilgili olarak '..' . \ E: \ Screen.png ', iki seviyeye çıkıp' Drive E 'için uzanıyor, böyle bir şey işe yarayacak. Resmim bu şekilde oluşturuldu veya @Alberto'nun cevabı .class dosyasının yanında oluşturuldu. –

cevap

17

Tthis kodu (JFrame olarak) benim için çalışıyor:

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")); 

Belki kullandığınız özel panelleri. Doğruysa, panellerinizin paint yöntemlerinin başına super.paint(g) eklemeyi deneyin.

DÜZENLEME:

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

DÜZENLEME 2: Sen çerçeve ekran sonra saveImagearamak zorunda Bu kaydedilmiş resimdir (biraz düzen çünkü, ama bunun kanıtıdır) çalışması gerekir:

enter image description here

Bendenilen Son arama olarak 210 olarak main ve kullanıcı dir (new File("Screen.png")) bir dosya nIcE cOw dedi.

+0

Boya yöntemini kullanmıyorum. Sadece panel kullanıyorum ve onunla bileşen ekliyorum. Ancak paneller görüntüye kaydedilirken görünmeyen bileşenler. –

+0

Düzenleme bölümüne bakın. Çerçeve görüntülendikten sonra saveImage öğesini çağırmanız gerekir. – Alberto

+0

Görünür bileşenlerin görüntülenmesi için [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) adresine bakın. ** için aşağı kaydırın Ayrıca bkz. Görüntülenmemiş bir bileşenden görüntü almama. Ve göstermeden önce bileşenleri render için diğer hileler bazıları [JTable başlığı görüntüde neden görünmüyor?] 'Da görülebilir. (Http://stackoverflow.com/q/7369814/418556) –

5

İşte bu örnek programı deneyin, getGraphics() kullanmak yerine BufferedImage yapmak için createGraphics() kullanmak zorunda gibi görünüyor.

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

Bkz. [ComponentImageCapture.java] (http: // stackoverflow.com/a/5853992/418556) görünür bileşenleri görüntülemek için aşağı kaydırın ** Ayrıca bkz. ** ve A sınıfı, kısa bir süre sonra görüntülenen bir bileşenden görüntü almamaya çalışırken, kısa bir süre içinde çalışmayan bir yer alır. Ayrıca, ekranın önündeki bileşenlerin görüntülenmesi için kullanılan diğer numaralar da [JTable başlığı görüntüde neden görünmüyor?] 'Da görülebilir (http://stackoverflow.com/q/7369814/418556) –

+0

@AndrewThompson: Bu değerli bağlantılar, bir kere daha önce “Swing'te Resim” yi öğrenmeye başladığımda, o zaman bütün o şeyin kafamın üzerinden geçmesine rağmen, son soruyu görmüştüm. Ama bu kez bu örneklerden yükler öğrenebileceğim umuduyla :-). Tekrar teşekkürler. Şerefe –

İlgili konular