0

我想制作我创建的面板的屏幕截图,代码如下所示。任何人都可以告诉我为什么我没有得到。谢谢

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

2 回答 2

1

你可以尝试使用类似的东西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 相同,是因为示例转储了根窗格、分层窗格和内容窗格......

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

        });
    }

}
于 2013-02-09T10:00:00.107 回答
1

以下对我有用:

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

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

于 2013-02-09T08:41:55.173 回答