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

这是合并 Image 数组的一种方法。

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 回答