make screenshot

2019-08-19 06:02发布

问题:

i want to make a screenshot of the panel that i have created and the code is given below. Can any body please tell me why i am not getting.thanks

    public static final void makeScreenshot(JFrame argFrame) 
    {
      Rectangle rec = argFrame.getBounds();
      BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height, BufferedImage.TYPE_INT_ARGB);
      argFrame.paint(bufferedImage.getGraphics());

    try 
   {
        // Create temp file.
        File temp = File.createTempFile("C:\\Documents and Settings\\SriHari\\My Documents\\NetBeansProjects\\test\\src\\testscreenshot", ".jpg");

        // Use the ImageIO API to write the bufferedImage to a temporary file
        ImageIO.write(bufferedImage, "jpg", temp);

        //temp.deleteOnExit();
    } 


   catch (IOException ioe) {} 
  } // 
        public static void main(String args[])
        {
           TimeTableGraphicsRunner ts= new TimeTableGraphicsRunner();
           for(long i=1;i<1000000000;i++);
           ts.makeScreenshot(jf);
            System.out.println("hi");
        }

回答1:

The following works for me:

public static void main (String [] args)
{
    final JFrame frame = new JFrame ();

    JButton button = new JButton (new AbstractAction ("Make Screenshot!")
    {
        @Override
        public void actionPerformed (ActionEvent e)
        {
            Dimension size = frame.getSize ();
            BufferedImage img = new BufferedImage (size.width, size.height, BufferedImage.TYPE_3BYTE_BGR);
            Graphics g = img.getGraphics ();
            frame.paint (g);
            g.dispose ();
            try
            {
                ImageIO.write (img, "png", new File ("screenshot.png"));
            }
            catch (IOException ex)
            {
                ex.printStackTrace ();
            }
        }
    });

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane ().setLayout (new BorderLayout ());
    frame.getContentPane ().add (button, BorderLayout.CENTER);
    frame.pack ();
    frame.setVisible (true);
}

It does not render window title and border because this is handled by OS, not Swing.



回答2:

You could try using something like Robot#createScreenCapture

If you don't want to capture the whole screen, you can use Component#getLocationOnScreen to find the position of the component on the screen instead...

public class CaptureScreen {

    public static void main(String[] args) {
        new CaptureScreen();
    }

    public CaptureScreen() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;

                frame.add(new JLabel("Smile :D"), gbc);

                JButton capture = new JButton("Click");
                capture.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            Robot robot = new Robot();
                            Rectangle bounds = frame.getBounds();
                            bounds.x -= 1;
                            bounds.y -= 1;
                            bounds.width += 2;
                            bounds.height += 2;
                            BufferedImage snapShot = robot.createScreenCapture(bounds);
                            ImageIO.write(snapShot, "png", new File("Snapshot.png"));
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });

                frame.add(capture, gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

}

Example using Component#getLocationOnScreen

public class CaptureScreen {

    public static void main(String[] args) {
        new CaptureScreen();
    }

    public CaptureScreen() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;

                frame.add(new JLabel("Smile :D"), gbc);

                JButton capture = new JButton("Click");
                capture.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            Robot robot = new Robot();
                            Container panel = frame.getContentPane();
                            Point pos = panel.getLocationOnScreen();
                            Rectangle bounds = panel.getBounds();
                            bounds.x = pos.x;
                            bounds.y = pos.y;
                            bounds.x -= 1;
                            bounds.y -= 1;
                            bounds.width += 2;
                            bounds.height += 2;
                            BufferedImage snapShot = robot.createScreenCapture(bounds);
                            ImageIO.write(snapShot, "png", new File("Snapshot.png"));
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });

                frame.add(capture, gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

}

Another Example show Component#getLocationOnScreen

The main reason 3 of the image are the same, is because the example dumps the root pane, layerd pane and content pane...

public class CaptureScreen {

    public static void main(String[] args) {
        new CaptureScreen();
    }

    public void save(Component comp, File file) {
        if (comp.isVisible()) {
            try {
                System.out.println(comp);
                Robot robot = new Robot();
                Rectangle bounds = new Rectangle(comp.getLocationOnScreen(), comp.getSize());
                bounds.x -= 1;
                bounds.y -= 1;
                bounds.width += 2;
                bounds.height += 2;
                BufferedImage snapShot = robot.createScreenCapture(bounds);
                ImageIO.write(snapShot, "png", file);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    private int layer;

    public void capture(Container container) {
        layer = 1;
        captureLayers(container);
    }

    public void captureLayers(Container container) {
        save(container, new File("SnapShot-" + layer + "-0.png"));
        int thisLayer = layer;
        int count = 1;
        for (Component comp : container.getComponents()) {
            if (comp instanceof Container) {
                layer++;
                captureLayers((Container) comp);
            } else {
                save(comp, new File("SnapShot-" + thisLayer + "-" + count + ".png"));
                count++;
            }
        }
    }

    public CaptureScreen() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;

                frame.add(new JLabel("Smile :D"), gbc);

                JButton capture = new JButton("Click");
                capture.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        capture(frame);
                    }

                });

                frame.add(capture, gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

}