[英]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
,当我不调用该方法时,它将正常初始化。
谢谢你的帮助!
Graphics g = panel.getGraphics();
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.