0

そこの。私はJavaを使用して、頻繁に再描画する必要のあるデスクトッププログラムを構築しています。以下のように:

class myWindow extends JWindow {
    Image[] layers = new Image[8]  // Some png Image object filled here

    @Override
    public void paint(Graphics g) {
        int i;

        super.paint();
        for (i=0;i<=7;i++)
            g.paintImage(layers[i], /*other param*/);
    }
 }

ご覧のとおり、ペイントには時間がかかるので、いくつかのバッファを作成したいと思いlayerます。ImageまたはGraphicsオブジェクトである必要があります。
しかし、それから私は(それらをもう一方に置くだけで)マージする方法をとることができないことに気づきました。Image
だから私の質問は:私が上で述べたようにどのようにバッファを構築することができますか、または私paintImage()が代替を描画するために使用する場合Graphicsどのようにこれを使用しGraphicsてウィンドウを描画
することができますか すべてに感謝します。

4

1 に答える 1

3

画像配列をマージする1つの方法は次のとおりです。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

class MyPanel extends JPanel {

    BufferedImage image;

    public MyPanel(Image[] layers) {
        this.image = createBufferedImage(layers);
    }

    protected BufferedImage createBufferedImage(Image[] layers) {
        Dimension maxSize = new Dimension();
        for (int i = 0; i < layers.length; i++) {
            Dimension d = new Dimension(layers[i].getWidth(this), 
                    layers[i].getHeight(this));
            maxSize = max(maxSize, d);
        }
        image = new BufferedImage(maxSize.width, maxSize.height, 
                BufferedImage.TYPE_INT_ARGB);
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, image.getWidth(), image.getHeight());

        for (int i = 0; i < layers.length; i++) {
            g.drawImage(layers[i], 0, 0, this);
        }
        g.dispose();
        return image;
    }

    protected Dimension max(Dimension a, Dimension b) {
        Dimension d = new Dimension();
        d.width = Math.max(a.width,  b.width);
        d.height = Math.max(a.height, b.height);
        return d;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }
 }
于 2012-09-10T14:14:17.197 に答える