2008-09-22 18 views
5

मेरे पास एक त्वरित प्रश्न है। मैं JComponent.paint या paintComponent द्वारा उत्पन्न छवि कैसे प्राप्त करूं?मैं छवि पेंट/पेंट कॉम्पोनेंट कैसे उत्पन्न करूं?

मेरे पास एक जेकंपोनेंट है जिसे मैं 'वर्कस्पेस' के रूप में उपयोग करता हूं और जहां मैंने स्वयं को पेंट कॉम्पोनेंट विधि को अधिलेखित किया है। बात यह है कि मेरे वर्कस्पेस जेकंपोनेंट में ऐसे बच्चे भी हैं जिनके पास अपना स्वयं का पेंट कॉम्पोनेंट विधियां हैं।

तो जब स्विंग मेरे वर्कस्पेस घटक को प्रस्तुत करता है, तो यह वर्कस्पेस ग्राफिक्स और उसके बाद के बच्चों को प्रस्तुत करता है।

हालांकि, मैं छवि को अपना वर्कस्पेस घटक उत्पन्न करना चाहता हूं (जिसमें वर्कस्पेस ग्राफिक्स और बच्चों के ग्राफिक्स शामिल हैं)।

मैं यह कैसे कर सकता हूं?

मैंने अपने स्वयं के ग्राफिक्स का उपयोग करके पेंट कॉम्पोनेंट/पेंट-विधि को कॉल करने का प्रयास किया, लेकिन मैंने अभी एक काला छवि लौटा दी। यहां मैंने कोशिश की है;

public void paintComponent(Graphics g) { 

    if (bufferedImage != null) { 
     g.drawImage(bufferedImage, 0, 0, this); 
    } 
    else { 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()); 
    } 
} 

public BufferedImage getImage() { 

    BufferedImage hello = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics g = hello.getGraphics(); 
    paintComponent(g); 

    return hello; 
} 

कोई भी विचार या टिप्पणियां आपका स्वागत है! :)

उत्तर

3

यदि आप बहुत जल्दी मिलते हैं, तो आपका घटक अभी तक प्रदर्शित नहीं होगा और अभी भी 0 चौड़ाई और ऊंचाई होगी। क्या आपने सुनिश्चित किया है कि आप इसे पर्याप्त देर से कॉल कर रहे हैं? घटक के आकार को stdout पर प्रिंट करने का प्रयास करें और देखें कि इसके आयाम क्या हैं।

+0

उपयोगकर्ता द्वारा विधि 'getImage' कहा जाता है, जिसका अर्थ है कि एप्लिकेशन में काफी समय है। – user20298

1

समस्या की तरह लगता है कि BufferedImage कैसे बनाया गया था। उपयोग करते समय:

BufferedImage hello = bufferedImage.getSubimage(0,0, getWidth(), getHeight()); 

इसके बजाय यह काम करता है। मुझे बच्चों को प्रस्तुत करने के लिए पेंट करने के लिए पेंट कॉम्पोनेंट से स्विच भी बदलना पड़ा।

समस्या हल हो गई, लेकिन अगर कोई जानता है। मेरा क्यों:

BufferedImage hello = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); 

हमेशा एक काला छवि प्रस्तुत करें? ऑफटॉपिक, लेकिन जानना दिलचस्प हो सकता है :)

+0

मुझे एक ही समस्या थी - BufferedImage.TYPE_INT_RGB को नए BufferedImage के प्रकार को बदलने से समस्या हल हो गई। –

0

बाहर से पेंट कॉम्पोनेंट() या पेंट() को कॉल न करें। इसके बजाय, अपनी छवि उन (ओवरराइट) विधियों के भीतर बनाई जानी चाहिए। फिर आप सुनिश्चित कर सकते हैं कि आपकी छवि में वास्तव में घटक की चित्रित सामग्री होगी।

यहां एक उदाहरण एप्लिकेशन है। ImagePanel वास्तव में घटक के ग्राफिक्स सामग्री को हर बार चित्रित करेगा, जो थोड़ा सा अपमानजनक हो सकता है, ताकि आप आवृत्ति को समायोजित करना चाहें जिसके साथ यह किया जाता है।

public class SomeApp extends JFrame { 

    private static class ImagePanel extends JPanel { 
     private BufferedImage currentImage; 
     public BufferedImage getCurrentImage() { 
      return currentImage; 
     } 
     @Override 
     public void paint(Graphics g) { 
      Rectangle tempBounds = g.getClipBounds(); 
      currentImage = new BufferedImage(tempBounds.width, tempBounds.height, BufferedImage.TYPE_INT_ARGB); 
      super.paint(g); 
      super.paint(currentImage.getGraphics()); 
     } 
    } 

    public SomeApp() { 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     setSize(800,600); 
     int matrixSize = 4; 
     setLayout(new BorderLayout()); 
     add(new JLabel("Wonderful Application"), BorderLayout.NORTH); 
     final ImagePanel imgPanel = new ImagePanel(); 
     imgPanel.setLayout(new GridLayout(matrixSize,matrixSize)); 
     for(int i=1; i<=matrixSize*matrixSize; i++) { 
      imgPanel.add(new JButton("A Button" + i)); 
     } 
     add(imgPanel, BorderLayout.CENTER); 
     final JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(new JButton(new AbstractAction("get image") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(SomeApp.this, new ImageIcon(imgPanel.getCurrentImage())); 
      } 

     })); 
     add(buttonPanel, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     System.setProperty("swing.defaultlaf", UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new SomeApp().setVisible(true); 
      } 
     }); 
    } 
} 

मार्टिजन की तरह, आपकी छवि शायद काला थी क्योंकि घटक को अभी तक चित्रित/प्रदर्शित नहीं किया गया था। जब आप प्रदर्शित होते हैं तो आप अधिसूचित होने के लिए एक घटक लिस्टनर जोड़ सकते हैं। GetSubimage के साथ आपके "समाधान" में वास्तविक समस्या से कोई लेना देना नहीं है। मैं आपको इसे हटाने की सलाह देते हैं।

+0

_Do बाहरी_ से पेंट() को गलत नहीं कहता है .. आप निश्चित रूप से अपने इच्छित व्हीवर से पेंट को कॉल कर सकते हैं - यह बिना किसी प्रतिबंध के सार्वजनिक तरीका है। – kleopatra

0

नई BufferedImage को TYPE_INT_RGB में बदलने से यह मेरे लिए हल हो जाता है। हालांकि मैं एक स्पष्टीकरण नहीं दे सकता - बस एक स्विंग रहस्य।

public BufferedImage getImage() { 

    BufferedImage hello = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics g = hello.getGraphics(); 
    paintComponent(g); 

    return hello; 
} 
संबंधित मुद्दे