我在我的JPanels上使用Background Panel类作为背景图片。到目前为止,我已经成功完成了Gradients,SCALED图像和ACTUAL图像,但是如果我将背景的样式设置为TILED,桌面应用程序会失败/崩溃,它会打开,但窗口是空的(见下),我必须停止应用程序关闭它。我在控制台中没有收到任何错误。
以下是我的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);
}
}
}
我发现 width = -1 因此导致无限循环。图像的宽度实际上是1个像素。高度(48像素)是正确的。当我将图像的宽度更改为48像素时,我得到了相同的结果。
更多测试:当我将宽度设置为48时,高度返回-1。
为什么图像宽度返回-1?
答案 0 :(得分:1)
来自java api:
返回:此图片的宽度,如果宽度尚不知道,则返回-1。
要解决此问题,您可以使用ImageIO.read(InputStream)。它将完全读取图像(创建BufferedImage
)。
final Image imgHeader =
ImageIO.read(getClass().getResourceAsStream("/images/headerBar.gif"));
然后,您可以使用image.getWidth()
和image.getHeight()
方法来获取图片的大小。