提问者:小点点

制作截图


我想对我创建的面板进行截图,下面给出了代码。任何机构都可以告诉我为什么我没有得到。谢谢

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

共2个答案

匿名用户

以下对我有用:

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

它不呈现窗口标题和边框,因为这是由OS处理的,而不是Swing。

匿名用户

您可以尝试使用Robot#createScreenCapture之类的东西

如果您不想捕获整个屏幕,您可以使用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();
                            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);
            }

        });
    }

}

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

        });
    }

}

另一个示例显示Component#getLocationOnScreen

图像的主要原因3相同,是因为示例转储根窗格、layerd窗格和内容窗格…

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

        });
    }

}