java - 在 JPanel 上平铺图像,java

标签 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,并且当我不调用该方法时正常初始化。

感谢您的帮助!

最佳答案

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

参见Painting in AWT and SwingPerforming Custom Painting有关 Swing/AWT 中绘画工作原理的更多详细信息。

getGraphics 可能会返回 null (甚至在文档中也这么说),并且您永远不应该依赖它,这不是自定义绘画的工作方式。相反,您应该重写组件 paintComponent 方法并在其中执行自定义绘制。

您无法控制绘制过程,也不应该直接调用 paint,Swing 使用被动渲染算法,这意味着组件会在 RepaintManager 决定它们需要重新绘制。这意味着,即使您可以让当前的代码正常工作,当 RepaintManager 决定重新绘制 panel 时,您渲染的所有内容都将丢失...

关于java - 在 JPanel 上平铺图像,java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28954028/

相关文章:

java - 如何使用 json 从 mysql 检索图像?

java - Weblogic 和 Oracle : Stuck ExecuteThread

java - 我可以在程序的不同部分重复使用 JLabel 组件吗?

java - 使用 WindowBuilder 通过 Graphics2D 绘制图形

java - JWebBrowser(扩展 JPanel)显示在玻璃 Pane 上方

java - 关闭 JiraRestClient 的 ssl 证书验证

java.util.Stack.peek(来源不明)错误

java - 使用 BorderLayout 创建两个偶数列

java - Swing 应用程序框架的表单设置存储在哪里?

java - JLabel滚动文本