1

我想创建一个捕获屏幕(1280x720 res)然后显示它的应用程序。这个代码在一个while循环中,所以它正在进行中。这是我所拥有的:

import javax.swing.*;

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

public class SV1 {

    public static void main(String[] args) throws Exception {
        JFrame theGUI = new JFrame();
        theGUI.setTitle("TestApp");
        theGUI.setSize(1280, 720);
        theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        theGUI.setVisible(true);

        Robot robot = new Robot();

        while (true) {
            BufferedImage screenShot = robot.createScreenCapture(new Rectangle(1280,720));

            JLabel picLabel = new JLabel(new ImageIcon( screenShot ));
            theGUI.add(picLabel);
        }
    }
}

我从这个答案中发现了这一点,但它并不适合我想要的。首先,由于某种我不确定的原因,它会导致 java 耗尽内存“Java 堆空间”。其次,由于显示的图像未更新,因此无法正常工作。

我读过有关使用 Graphics (java.awt.Graphics) 绘制图像的信息。谁能给我看一个例子?或者,如果有更好的方法,也许可以为我指明正确的方向?

4

1 回答 1

3

它导致java内存不足“Java堆空间”

您将永远循环并不断将新的 JLabels 添加到您的JFrame. 您可以尝试而不是每次都重新创建 JLabel,而只需设置一个新的 ImageIcon:

JLabel picLabel = new JLabel();
theGUI.add(picLabel);
while (true) 
{
    BufferedImage screenShot = robot.createScreenCapture(new Rectangle(1280,720));
    picLabel.setIcon(new ImageIcon(screenShot));   

}

如果你想使用绘画Graphics(在这种情况下它可能是一个更好的主意),你可以扩展一个JLabel和覆盖paintComponent方法,在其中绘制图像:

public class ScreenShotPanel extends JLabel
{

    @override
    public void paintComponent(Graphics g) {
        BufferedImage screenShot = robot.createScreenCapture(new Rectangle(1280,720));
        g.drawImage(screenShot,0,0,this);
    }
}
于 2012-08-21T23:31:31.367 回答