繁体   English   中英

getSize(),getWidth(),getHeight()返回-1

[英]getSize(), getWidth(), getHeight() returns -1

我有一个Image img,尝试使用上述任何get方法时,返回-1。 为什么是这样? 什么是ImageObserver对象?

根据Image的文档,如果大小,宽度或高度(分别)未知,这些方法将返回-1。

同样, ImageObserver只是一个接口,提供提供有关正在构造的Image对象的信息的通知的方法。

您可以使用MediaTrack来获取图像的宽度和高度,如下所示:

 // ...

 Image img;
 // ...
 // ...  loading the image using IO or Toolkit ot something

 MediaTracker MTrack = new MediaTracker(this); // in my case, 'this' is a JFrame

 MTrack.addImage(img,1);
 try 
{
    MTrack.waitForID(1);
} 
catch(InterruptedException e) 
{
   e.getMessage();
}

int width = img.getWidth(null);
int height = img.getHeight(null);

double ratio = (double)width/(double)height;

// ....
// ....

根据Java文档 ,似乎如果在Image仍处于构造阶段时在其上调用getHeight()等,以使高度不是真正“已知”,则返回-1并通知所提供的ImageObserver。

ImageObserver是一个接口,可为您提供一种以某种方式更新图像时调用的回调方法的方法。 ImageObserver由java.awt.Component实现,因此,如果在包含的类中扩展它,则可以重写imageUpdated()并在异步调用该函数时存储图像高度(如果Image.getHeight返回-1)。

在GraphTest中,覆盖imageUpdate:

@Override
public void imageUpdate(Image img, int flags,
               int x, int y, int width, int height) {
    if ((flags & (WIDTH|HEIGHT)) == (WIDTH|HEIGHT)) {
        // width and height have meaningful values, do your resize here
    }
    super.imageUpdate(img, flags, x, y, width, height);
}

问题是加载图像所需的时间。

只要未加载图像,您就会得到-1。 最终加载图像后,它将触发 ImageObserver。 观察服务器,在您的情况下为Background实例g.drawImage(bkg, 0, 0, this); -将强制重新绘制背景,从而绘制当前加载的图像。

您也可以使用java.awt.MediaTracker来跟踪图像的状态。

[]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM