在JPanel,java上平铺图像

时间:2015-03-10 00:11:24

标签: java swing jpanel

我有一种设置JPanel的'纹理'的方法,但它会抛出NullPointerException,我无法弄清楚原因。

方法:

void setTexutre(Image tileImage) {
    Graphics g = panel.getGraphics();
    int width = (int) getBounds().getWidth();
    int height = (int) getBounds().getHeight();
    int imageW = tileImage.getWidth(panel);
    int imageH = tileImage.getHeight(panel);
    for (int x5 = 0; x5 < width; x5 += imageW) {
        for (int y5 = 0; y5 < height; y5 += imageH) {
            g.drawImage(tileImage, x5, y5, panel);
        }
    }
    panel.paint(g);
}

当我调用“g.drawImage(tileImage,x5,y5,panel);”

时会抛出NullPointerException

是的,图像是真实的图像,我检查过。在上面的方法中,panel被定义为新的JPanel,并且在我不调用该方法时正常初始化。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

  1. DON&#39; T使用Graphics g = panel.getGraphics();
  2. 永远不要致电panel.paint(g);
  3. 有关绘画在Swing / AWT中的工作原理的详细信息,请参阅Painting in AWT and SwingPerforming Custom Painting

    getGraphics可能会返回null(它甚至记录为这样说),你应该永远不要依赖它,它不是自定义绘画的工作方式。相反,您应该覆盖组件paintComponent方法并在其中执行自定义绘制。

    你不能控制绘制过程,不应该直接调用paint,Swing使用被动渲染算法,这意味着当RepaintManager决定时,组件会进行临时更新他们需要重新粉刷。这意味着,即使您可以使当前代码正常工作,RepaintManager决定重绘panel的那一刻,您渲染的所有内容都将丢失......

答案 1 :(得分:-1)

以下是我用于查看此问题的其他人的课程。

package i.am.not.posting.the.real.pack.name;

import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class TiledPanel extends JPanel {

    private BufferedImage tileImage;

    public TiledPanel(BufferedImage tileImage) {
        this.tileImage = tileImage;
    }

    protected void paintComponent(Graphics g) {
        int width = getWidth();
        int height = getHeight();
        int imageW = tileImage.getWidth();
        int imageH = tileImage.getHeight();
        // Tile the image to fill our area.
        for (int x = 0; x < width; x += imageW) {
            for (int y = 0; y < height; y += imageH) {
                g.drawImage(tileImage, x, y, this);
            }
        }
    }
}

只需创建TilePanel对象即可正确平铺图像。