有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java应用程序在将JPanel的背景图像设置为平铺时失败

我正在使用Background Panel类在我的JPanel上生成背景图像。到目前为止,我已经在渐变、缩放图像和实际图像方面取得了成功,但如果我将背景样式设置为平铺,桌面应用程序将失败/崩溃,它将打开,但窗口为空(透明),我必须停止应用程序以关闭它。我的控制台没有收到任何错误

这是我的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


共 (1) 个答案

  1. # 1 楼答案

    来自java api

    Returns: the width of this image, or -1 if the width is not yet known.


    要解决这个问题,可以使用ImageIO.read(InputStream)。它将完全读取图像(创建一个^{}

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

    然后可以使用image.getWidth()image.getHeight()方法获得图像的大小