Search code examples
javascreenshot

Screenshot based on JPanel location and size


I'm trying to take a screenshot of what's behind of a JPanel but i get a black image after saving it.

Here's the code:

private void takeScreenshot(String print){
        JFileChooser c = new JFileChooser(getRealDesktop());
        FileFilter jpg = new FileNameExtensionFilter(".jpg", ImageIO.getReaderFileSuffixes());
        FileFilter jpeg = new FileNameExtensionFilter(".jpeg", ImageIO.getReaderFileSuffixes());
        FileFilter png = new FileNameExtensionFilter(".png", ImageIO.getReaderFileSuffixes());
        c.setFileFilter(png);
        c.setFileFilter(jpeg);
        c.setFileFilter(jpg);
        c.showSaveDialog(this);
        if(c.getSelectedFile() != null){
            String ssLoc = c.getSelectedFile().getAbsolutePath()+c.getFileFilter().getDescription();
            System.out.println(ssLoc);
            BufferedImage bufImg = new BufferedImage(ssWindow.getSize().width, ssWindow.getSize().height,BufferedImage.TYPE_INT_RGB);  
            ssWindow.paint(bufImg.createGraphics());
            File imageFile = new File(ssLoc);  
            try{  
                imageFile.createNewFile();  
                ImageIO.write(bufImg, "JPG", imageFile);  
            }catch(Exception ex){
                System.err.println(ex);
            }
        }
    }

And the press action button looks like this:

this.setVisible(false);
takeScreenshot("ssTake");
this.setVisible(true);

How can make this work?


Solution

  • Thanks, Gilbert Le Blanc.

    I reworked a bit the code to use the robot for this and now the code looks like this:

    private void takeScreenshot(String print){
            JFileChooser c = new JFileChooser(getRealDesktop());
            FileFilter jpeg = new FileNameExtensionFilter("JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)", "jpg", "jpeg", "jpe", "jfif");
            c.setFileFilter(jpeg);
            c.showSaveDialog(this);
            if(c.getSelectedFile() != null){
                ssLoc = c.getSelectedFile().getAbsolutePath()+".jpg";
                try {
                    Thread.sleep(150);
                    Robot robot = new Robot();
                    BufferedImage screenShot = robot.createScreenCapture(new Rectangle(ssWindow.getX(),ssWindow.getY(),ssWindow.getWidth(),ssWindow.getHeight()));
                    ImageIO.write(screenShot, "JPG", new File(ssLoc));
                    System.out.println(print);
                } catch (AWTException | IOException | InterruptedException ex) {
                    Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }