2014-06-26 7 views
5

मेरे पास JPanel है जिसमें JComboBox शामिल है। मैं इस पैनल का स्क्रीनशॉट लेने की कोशिश कर रहा हूं जब JComboBox खुला है। लेकिन मैं यह नहीं कर सका। कोई उपाय?खोले गए comboboxes के साथ एक पैनल का स्क्रीनशॉट

यदि आप इस कोड को चलाते हैं तो Alt-P दबाएं जब कॉम्बो खुला है, तो आप समस्या देखेंगे।

public class ScreenShotDemo { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     final JPanel JMainPanel = new JPanel(new BorderLayout()); 

     JPanel jp = new JPanel(); 
     jp.add(new JComboBox<String>(new String[] { "Item1", "Item2", "Item3" })); 

     final JPanel jImage = new JPanel(); 

     JMainPanel.add(jp, BorderLayout.WEST); 
     JMainPanel.add(jImage, BorderLayout.CENTER); 

     jp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.ALT_DOWN_MASK), "screenshot"); 
     jp.getActionMap().put("screenshot", new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       BufferedImage bf = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB); 
       JMainPanel.paint(bf.getGraphics()); 
       jImage.getGraphics().drawImage(bf, 0,0,jImage); 
      } 
     }); 

     final JFrame jf = new JFrame(); 
     jf.getContentPane().add(JMainPanel); 
     jf.setSize(500, 500); 
     jf.setVisible(true); 
    } 
} 
+0

है हाँ यह एक समस्या मैं बिताया है घंटे, एक महत्वपूर्ण सवाल है। – benchpresser

उत्तर

5

लटकती पॉपअप विंडो JComboBox के घटक पदानुक्रम का हिस्सा नहीं है, और इसलिए यह के भाग के रूप तैयार नहीं है, लेकिन स्वतंत्र रूप से। (कोई भी परिवर्तन करने के लिए पहले से ही दिखाई दे पॉपअप पैक किया जाना चाहिए डिफ़ॉल्ट रूप से

@Override 
public void actionPerformed (ActionEvent arg0) { 

    Point p = new Point(0, 0); 
    SwingUtilities.convertPointToScreen(p, JMainPanel); 
    Rectangle screenBounds = new Rectangle(p.x, p.y, JMainPanel.getSize().width, JMainPanel.getSize().height); 

    try { 
     Robot robot = new Robot(); 
     BufferedImage screenCapture = robot.createScreenCapture(screenBounds); 

     jImage.getGraphics().drawImage(screenCapture, 0, 0, jImage); 
    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 
} 
+0

उत्कृष्ट समाधान – bahtiyartan

2
  • AWT/घुमाओ में सभी Popup रों हैं Heavyweight (:

    इस के लिए एक समाधान java.awt.Robot का उपयोग कर एक वास्तविक स्क्रीन शॉट लेने के लिए है) 'ईडी)

  • यहाँ

    भारी BasicsComboBoxPopup के लिए पदानुक्रम में शीर्ष दिग्गज घटक प्राप्त करने के लिए स्क्रीनशॉट के लिए awt.Robot उपयोग करने के लिए आवश्यक नहीं है, है, इसहैJFrame

उदा।

enter image description here

enter image description here

कोड से

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.AbstractAction; 
import javax.swing.JComboBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class ScreenShotDemo { 

    private JPanel JMainPanel = new JPanel(new BorderLayout()); 
    private JPanel jp = new JPanel(); 
    private JComboBox combo = new JComboBox(new String[]{"Item1", "Item2", "Item3"}); 
    private JPanel jImage = new JPanel(); 
    private JFrame jf = new JFrame(); 

    public ScreenShotDemo() { 
     jp.add(combo); 
     JMainPanel.add(jp, BorderLayout.WEST); 
     JMainPanel.add(jImage, BorderLayout.CENTER); 
     jp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
       KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.ALT_DOWN_MASK), "screenshot"); 
     jp.getActionMap().put("screenshot", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       final BufferedImage bf = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB); 
       javax.swing.SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         jf.getRootPane().paint(bf.getGraphics()); 
         jImage.getGraphics().drawImage(bf, 0, 0, jImage); 
        } 
       }); 
      } 
     }); 
     jf.getContentPane().add(JMainPanel); 
     jf.setSize(500, 500); 
     jf.setVisible(true); 
    } 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ScreenShotDemo(); 
      } 
     }); 
    } 
} 
संबंधित मुद्दे