繁体   English   中英

在JPanel,Java上平铺图像

[英]Tileing image on JPanel, java

我有一种方法可以设置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 ,当我不调用该方法时,它将正常初始化。

谢谢你的帮助!

  1. 不要使用Graphics g = panel.getGraphics();
  2. 永远不要调用panel.paint(g);

有关绘画如何在Swing / AWT中工作的更多详细信息,请参见AWT中的绘画和Swing执行自定义绘画

getGraphics可能会返回null (甚至被记录为如此),并且您不应该依赖它,这不是自定义绘画的工作原理。 相反,您应该重写组件paintComponent方法并在其中执行自定义绘制。

您无需控制绘制过程,并且永远不要直接调用paint ,Swing使用被动渲染算法,这意味着, RepaintManager决定需要对其进行重新绘制,组件都是临时更新的。 这意味着,即使您可以使当前代码正常工作,在RepaintManager决定重新绘制panel的那一刻,所有呈现的内容都会丢失...

以下是我用于其他任何人正在研究此问题的课程。

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对象,即可正确平铺图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM