Java Swing How to - Take Screenshot of a panel with opened JComboBox








Question

We would like to know how to take Screenshot of a panel with opened JComboBox.

Answer

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
/*from  w  w  w. ja  v  a 2  s  . c  om*/
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 Main {
  public static void main(String args[]) {
    JPanel JMainPanel = new JPanel(new BorderLayout());
    JPanel jp = new JPanel();
    JComboBox combo = new JComboBox(new String[] { "Item1", "Item2", "Item3" });
    JPanel jImage = new JPanel();
    JFrame jf = new JFrame();

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