这是我第一次用Java编写代码,所以请跟我一起打电话。 :P
我想创建一个捕获屏幕(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);
}
}
}
我从this answer想出了这一点,但它并不适合我想要的东西。首先,由于某些原因我不确定,它会导致java耗尽内存“Java堆空间”。其次,由于未更新显示的图像,因此无法正常工作。
我读过有关使用Graphics(java.awt.Graphics)绘制图像的内容。有人能告诉我这个例子吗?或者,如果有更好的方法,或许可以指出我正确的方向?谢谢您的帮助。 :)
答案 0 :(得分:3)
它导致java耗尽内存“Java堆空间”
您正在永远循环并不断向您的JFrame
添加新的JLabel。
您可以尝试而不是每次重新创建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
方法,在其中绘制图像:< / p>
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);
}
}