1

画面 (1280x720 解像度) をキャプチャして表示するアプリを作成したいと考えています。このコードは 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ヒープスペース」

あなたは永遠にループしていて、あなたのに新しいJLabelを継続的に追加しています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 に答える