1

以下は、Romain Guy と Chet Haase による「Filthy Rich Clients」のコードです。

private class ImageViewer extends JComponent {
    private BufferedImage image, landscape;

    private ImageViewer() {
        try {
            image = ImageIO.read(new File("picture.png"));
            landscape = ImageIO.read(new File("landscape.jpg"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        BufferedImage temp = new BufferedImage(getWidth(), getHeight(),
            BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = temp.createGraphics();

        if (shadow.isSelected()) {
            int x = (getWidth() - image.getWidth()) / 2;
            int y = (getHeight() - image.getHeight()) / 2;
            g2.drawImage(image, x + 4, y + 10, null);

            Composite oldComposite = g2.getComposite();
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 0.75f));
            g2.setColor(Color.BLACK);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setComposite(oldComposite);
            g2.drawImage(image, x, y, null);
        } else {
            int x = (getWidth() - image.getWidth()) / 2;
            int y = (getHeight() - image.getHeight()) / 2;
            g2.drawImage(image, x, y, null);

            Composite oldComposite = g2.getComposite();
            g2.setComposite(AlphaComposite.SrcIn);
            x = (getWidth() - landscape.getWidth()) / 2;
            y = (getHeight() - landscape.getHeight()) / 2;
            g2.drawImage(landscape, x, y, null);
            g2.setComposite(oldComposite);
        }

        g2.dispose();
        g.drawImage(temp, 0, 0, null);
    }
}

チェックボックスがチェックされている場合、さまざまな状態で次の出力を取得するのはコードの一部です:- ここに画像の説明を入力

私が理解していないのは

1) ラインは何ですか

BufferedImage temp = new BufferedImage(getWidth(), getHeight(),
        BufferedImage.TYPE_INT_ARGB);

次のコードだけを記述して実行すると、出力に何も得られないためです。

BufferedImage temp = new BufferedImage(getWidth(), getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = temp.createGraphics();

    if (jcb.isSelected()) {
        int x = (getWidth() - image.getWidth()) / 2;
        int y = (getHeight() - image.getHeight()) / 2;
        g2.drawImage(image, x + 4, y + 10, null);
           }

2)「temp」bufferedImage を作成した後に g2 を取得する必要は何ですか? 直接のようにできませんか

Graphics2D g2=(Graphics2D)g.create();

3) TYPE_INT_RGB と TYPE_INT_ARGB の実質的な違いは何ですか?

4

1 に答える 1

3

これはダブルバッファリングです: http://docs.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html

最初に画面外の画像を描画します。この場合、この画像は変数 temp で参照される BufferedImage オブジェクトによってサポートされます。次に、画面外の画像に対して何でもします。最後に、g.drawImage(temp, ...) を介してコンポーネントに結果を出力します。これは、画像が画面上に直接構築されているために、ユーザーにグリッチやアーティファクトが表示されないようにするためです。

于 2012-10-28T11:58:43.570 に答える