在 JPanel 上平铺图像,java
Tileing image on JPanel, java
我有一个方法可以设置 JPanel
的 'texture',但是它抛出了 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 绘画工作原理的更多详细信息,请参阅 Painting in AWT and Swing and Performing Custom Painting。
getGraphics
可能 return null
(它甚至被记录为这样说),你不应该依赖它,这不是自定义绘画的工作方式。相反,您应该覆盖组件 paintComponent
方法并在其中执行自定义绘制。
您不控制绘制过程,永远不应该直接调用 paint
,Swing 使用被动渲染算法,这意味着组件是临时更新的,只要 RepaintManager
决定他们需要重新粉刷。这意味着,即使您可以使当前代码正常工作,RepaintManager
决定重新绘制 panel
的那一刻,您所有的渲染都将丢失...
以下是class我用于其他人看这个问题的。
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 对象即可正确平铺图像。
我有一个方法可以设置 JPanel
的 'texture',但是它抛出了 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 绘画工作原理的更多详细信息,请参阅 Painting in AWT and Swing and Performing Custom Painting。
getGraphics
可能 return null
(它甚至被记录为这样说),你不应该依赖它,这不是自定义绘画的工作方式。相反,您应该覆盖组件 paintComponent
方法并在其中执行自定义绘制。
您不控制绘制过程,永远不应该直接调用 paint
,Swing 使用被动渲染算法,这意味着组件是临时更新的,只要 RepaintManager
决定他们需要重新粉刷。这意味着,即使您可以使当前代码正常工作,RepaintManager
决定重新绘制 panel
的那一刻,您所有的渲染都将丢失...
以下是class我用于其他人看这个问题的。
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 对象即可正确平铺图像。