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

标签 java swing width background-image jpanel

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

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

最佳答案

来自java api :

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

<小时/>

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

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

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

关于java - 将 JPanel 的背景图像设置为 TILED 时应用程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387364/

相关文章:

java - 在 Optional 中包装对象以使用 ifPresent 方法?

javascript - 对 spring @ResourceMapping 方法进行 react ,未使用相同的请求参数调用

javascript - 渐进式宽度调整 : is this for aesthetic or technical reasons?

css - 页脚不完全占据页面的 100% ( CSS )

java - 如何使用 Scala 的 AnyVal 调用 Java 可变参数方法?

java - 为了解决 OC4J 10.1.3.5 中的 UnsupportedOperationException,首先要检查的是什么?

java - 在学习 Swing 之前必须先学习 AWT 吗?

java - 如何在调用 `setVisible(true)` 后调整 JComponent 的大小?

java - 为什么我的 NumberFormatException 没有被我的 try-catch 捕获?

CSS:用边距调整框宽度?