截图问题-排除自己的应用程序.从截图



我有一个小问题,我真的不知道如何解决,基本上我想截取我的桌面的屏幕截图(使用"Robot"类),不包括实际的程序GUI组件。最初我认为它可以通过临时隐藏组件来完成,但每次新截图时,组件都包含在图像中。

这是包含在actionPerformed方法中的块,用于截取屏幕截图的按钮:

if (command.equals("zoom")) {
    setComponentVisability(false);//try to hide the components from the robot
    zt.screenShoot();//take the screenshot
    setComponentVisability(true);//show the components
} 

" zt型。screenShoot"获取屏幕截图并在一个新的JFrame中返回它(用于调试),在我的主框架中,我使用

com.sun.awt.AWTUtilities.setWindowOpaque(systemWindow, false);

方法使背景透明;我不确定这是否与这个问题有关。

任何帮助将是伟大的,由于

在隐藏组件和截图之间设置一个短暂的延迟

如TestScreenshot.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
class TestScreenshot {
    static JLabel screenshot;
    public static void main(String[] args) throws Exception {
        final Robot robot = new Robot();
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                final JFrame f = new JFrame("Screenshot");
                JPanel gui = new JPanel(new BorderLayout(3,3));
                gui.setBorder(new EmptyBorder(5,5,5,5));
                f.setContentPane(gui);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                screenshot = new JLabel();
                JScrollPane scroll = new JScrollPane(screenshot);
                scroll.setPreferredSize(new Dimension(800,600));
                gui.add(scroll, BorderLayout.CENTER);
                final ActionListener al = new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        Rectangle screenSize = new Rectangle(
                            Toolkit.getDefaultToolkit().getScreenSize());
                        Image image = robot.createScreenCapture(screenSize);
                        setImage(image);
                        f.setVisible(true);
                    }
                };
                JButton grabScreen = new JButton("Grab Screen");
                grabScreen.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        f.setVisible(false);
                        Timer timer = new Timer(400, al);
                        timer.setRepeats(false);
                        timer.start();
                    }
                } );
                gui.add(grabScreen, BorderLayout.SOUTH);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
    public static void setImage(Image image) {
        screenshot.setIcon(new ImageIcon(image));
    }
}

相关内容

最新更新