2012-06-30 9 views
11

हाय मैं पैनल को कन्वर्ट करना चाहता हूं जिसमें छवि फ़ाइल में लेबल और बटन जैसे घटक शामिल हैं।पैनल को स्विंग में छवि के रूप में कैसे सहेजना है?

मैंने निम्नलिखित कोड किया है। छवि सहेजा गया था। लेकिन पैनल की सामग्री दिखाई नहीं दे रही है या सहेजा नहीं गया है। क्या कोई मुझे बता सकता है कि पैनल को इसके घटकों के साथ कैसे सहेजना है।

कोड:

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

सी [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) दिखाई घटकों प्रदर्शित करने के लिए - के लिए नीचे स्क्रॉल ** यह भी देखें ** और रोब Camick द्वारा एक वर्ग है कि लेता है एक प्रदर्शित किए गए घटक से छवि लेने से बहुत सारी चीजें काम करती हैं। और प्रदर्शन से पहले घटकों को प्रस्तुत करने के लिए कुछ अन्य चालें देखी जा सकती हैं [छवि में जेटीबल हेडर क्यों नहीं दिखता है?] (Http://stackoverflow.com/q/7369814/418556) –

+1

मुझे लगता है कि आप हैं फाइल बनाने के लिए गलत 'पथ' प्रदान करना। चूंकि आपका प्रोग्राम 'ड्राइव ई' के बारे में कुछ भी नहीं जानता है, इसलिए नई 'फाइल' जिसे बनाया जाएगा, '.class फ़ाइल' के संबंध में 'सापेक्ष पथ' के साथ संदर्भित किया जाना चाहिए, जैसे' .. \। \ E: \ Screen.png', इसे दो स्तरों पर जाने और फिर 'ड्राइव ई' के लिए पहुंचने के लिए, ऐसा कुछ काम करेगा। मेरे उत्तर या @Alberto के उत्तर के साथ बनाई गई छवि .class फ़ाइल के बगल में बनाई गई है। –

उत्तर

17

Tthis कोड मेरे लिए काम करता (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")); 

शायद तुम उन कस्टम पैनलों। यदि सही है, तो अपने पैनलों के paint विधियों की शुरुआत में super.paint(g) जोड़ने का प्रयास करें।

संपादित:

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

संपादित 2:: आप प्रदर्शन के बाद saveImageकॉल करने के लिए फ्रेम यह सहेजी गई छवि है (थोड़ा है, क्योंकि लेआउट, लेकिन सबूत यह है कि है काम करना चाहिए):

enter image description here

मैंबुलाया main में अंतिम कॉल के रूप में 210, और उपयोगकर्ता डीआईआर (new File("Screen.png")) में एक फ़ाइल का उपयोग किया गया क्योंकि nIcE cOw ने कहा।

+0

मैं पेंट विधि का उपयोग नहीं कर रहा हूं। मैं सिर्फ पैनल का उपयोग कर रहा हूं और इसके साथ घटकों को जोड़ रहा हूं। लेकिन छवियों में पैनल को सहेजते समय घटक दिखाई नहीं देते हैं। –

+0

मेरा संपादन देखें। फ्रेम प्रदर्शित होने के बाद आपको saveImage को कॉल करना होगा। – Alberto

+0

दृश्य घटकों को प्रदर्शित करने के लिए [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) देखें - ** के लिए नीचे स्क्रॉल करें ** रॉब कैमिक द्वारा ** और एक कक्षा भी देखें जो बहुत अधिक काम करता है एक घटक से एक छवि लेने से बाहर जो प्रदर्शित नहीं किया गया है। और प्रदर्शन से पहले घटकों को प्रस्तुत करने के लिए कुछ अन्य चालें देखी जा सकती हैं [जेटीबल हेडर छवि में क्यों नहीं दिखता है?] (Http://stackoverflow.com/q/7369814/418556) –

5

getGraphics() का उपयोग करने के बजाए इस उदाहरण प्रोग्राम को आजमाएं, ऐसा लगता है कि BufferedImage के लिए आपको createGraphics() का उपयोग करना है।

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

देखें [ComponentImageCapture.java] (http: // stackoverflow।कॉम/ए/58539 9 2/418556) दृश्य घटकों को प्रदर्शित करने के लिए - ** के लिए नीचे स्क्रॉल करें ** और रॉब कैमिक द्वारा एक कक्षा भी देखें जो प्रदर्शित नहीं होने वाले घटक से छवि लेने से बहुत अधिक काम करता है। और प्रदर्शन से पहले घटकों को प्रस्तुत करने के लिए कुछ अन्य चालों को देखा जा सकता है [जेटीबल हेडर छवि में क्यों नहीं दिखता है?] (Http://stackoverflow.com/q/7369814/418556) –

+0

@AndrewThompson: धन्यवाद इन मूल्यवान लिंक, मैंने आखिरी सवाल देखा था, एक बार पहले जब मैंने 'स्विंग में चित्रकारी' सीखना शुरू किया था, हालांकि उस समय पूरी चीज मेरे सिर पर चली गई थी। लेकिन इस बार उम्मीद है कि मैं इन उदाहरणों से लोड सीखने में सक्षम हूं :-)। फिर से धन्यवाद। चियर्स –

संबंधित मुद्दे