将JPanel的背景图像设置为TILED时,应用程序失败

2020年3月22日 11点热度 0条评论

我在我的JPanels上将Background Panel类用于背景图像。到目前为止,我已经成功实现了Gradients,SCALED图像和ACTUAL图像,但是如果我将背景样式设置为TILED,则Desktop Application失败/崩溃,它将打开,但窗口为空(透视),我必须停止该应用程序关闭它。我的控制台没有任何错误。

这是我的JPanel上的自定义代码:

jPanel2 = new BackgroundPanel(imgHeader, BackgroundPanel.TILED);

我的图像在以下位置定义:

final Image imgHeader = java.awt.Toolkit.getDefaultToolkit().getImage(getClass().getResource("/images/headerBar.gif"));

我向后台面板类添加了日志记录语句

private void drawTiled(Graphics g) {
    Dimension d = getSize();
    int width = image.getWidth(null); // returning as -1. should be 1
    int height = image.getHeight(null); // returning as 48. Correct!

    for (int x = 0; x < d.width; x += width) {
        System.err.println("outer for imgW" + width + " panelW " + d.width + " newW " + x);
        for (int y = 0; y < d.height; y += height) {
            g.drawImage(image, x, y, null, null);
            System.err.println("inner for" + height);
        }
    }
}

我发现,宽度= -1导致了无限循环。图像的宽度实际上是1个像素。高度(48个像素)正确。当我将图像的宽度更改为48像素时,我得到了相同的结果。

更多测试:将宽度设置为48时,高度返回-1。

为什么图像宽度返回-1?

解决方案如下:

从Java api

返回:此图像的宽度;如果宽度未知,则返回-1。

要解决该问题,您可以使用ImageIO.read(InputStream)。它将完全读取图像(创建BufferedImage)。

final Image imgHeader = 
         ImageIO.read(getClass().getResourceAsStream("/images/headerBar.gif"));

然后,您可以使用
image.getWidth()
image.getHeight()方法来获取图像的大小。