1

昨日、Robot クラスを発見し、とてもクールだと思いました。今日、私はそれを試してみて、何が可能かを見てみたいと思いました。そこで、画面全体のスクリーンショットを撮り、JPanel でピクセルごとに画像をレンダリングするプログラムを作成することにしました。私はプログラムを完成させました (2 つのクラス) が、動作せず、理由がわかりません (コードを数回調べました)。コードは次のとおりです。

(ファーストクラス)

import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class One { 
    public static void main(String[] args) { 
        BufferedImage screenCap = null;
        Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        try {
            screenCap = new Robot().createScreenCapture(screenRect);
            Two imageRenderer = new Two(screenCap, screenRect);
            imageRenderer.doRender();
            JFrame frame = new JFrame();
            frame.setVisible(true);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());
            frame.add(imageRenderer);
            frame.pack();
        } catch (AWTException e) { 
            e.printStackTrace(); 
        } 
    } 
}

(二等)

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class Two extends JPanel {
    private BufferedImage screenCap;
    private Rectangle screenRect;

    private Color pixelRGB;
    //c1 and c2 are the x and y co-ordinates of the selected pixel.
    private int c1, c2;

    public Two(BufferedImage sC, Rectangle rect) {
        screenCap = sC;
        screenRect = rect;
        setPreferredSize(new Dimension(rect.width, rect.height));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);

        g.setColor(pixelRGB);
        g.drawRect(c1, c2, 1, 1);
    }

    public void doRender() {
        for(int i=0; i<screenRect.width; i++) {
            for(int j=0; j<screenRect.height; j++) {
                pixelRGB = new Color(screenCap.getRGB(i, j));
                c1 = i;
                c2 = j;
                repaint();
            }
        }
    }
}

私はこの問題をグーグルで調べましたが、役に立ちませんでした。

誰が私が間違っているのか教えてもらえますか?

4

3 に答える 3

3

機能させるにpaintComponent()は、クラスのメソッドをTwo次のように置き換えます。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    setBackground(Color.WHITE);
    g.drawImage(screenCap, 0, 0, getWidth(), getHeight(), null);
}

メソッドを削除することもできますdoRender()

于 2012-09-10T18:13:51.627 に答える
1

TwoJLabelはおそらくを表示しているのインスタンスであるはずscreenCapです。例えば

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Screenshot {

    public static void main(String[] args) throws Exception {
        Rectangle screenRect = new Rectangle(
                Toolkit.getDefaultToolkit().getScreenSize());

        final BufferedImage screenCap = 
                new Robot().createScreenCapture(screenRect);
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JOptionPane.showMessageDialog(null, new ImageIcon(screenCap));
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

本当にきれいにしたい場合は、スクロール ペインにドロップします。電池は含まれていません。

明らかでない場合: AJOptionPaneは aJLabelを使用して an をレンダリングしますImageIcon

于 2012-09-10T19:35:15.433 に答える
0

再描画するたびに、パネル全体を白く塗りつぶしてから、1 つのピクセルだけを塗りつぶします。したがって、それぞれの後に、1 つのピクセルしか取得できません。repaintまた、何度も呼び出す必要はありません。実際、 を呼び出しrepaintても、すぐに が実際に呼び出されるわけではありませんpaintComponent。これは単に再描画の要求を送信するだけであり、最終的にはそれが行われます。そして、それは1対1ではないかもしれません。たとえば、 を何度も呼び出してもrepaint、 は 1 回しか呼び出されない場合がありpaintComponentます。を 1 回呼び出すだけでpaintComponentコンポーネントが完全に表示されるように、コードを記述するようにしてください。

これを行うにはg.drawImage、BufferedImage を表示するために使用できます。JPanel で画像を表示する方法の詳細については、この投稿を参照してください。

于 2012-09-10T18:10:42.490 に答える