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

Java getSize(),getWidth(),getHeight()返回-1,java,Java,我有一个图像img,当尝试使用上述任何get方法时,它返回-1。为什么会这样?什么是ImageObserver对象?根据,如果大小、宽度或高度(分别)未知,这些方法将返回-1 此外,它只是一个接口,提供了获取有关正在构造的图像对象信息的通知的方法。根据,如果在图像仍处于构造阶段时对其调用getHeight()等,那么高度似乎并不真正“已知”,返回-1并通知提供的ImageObserver 是一个接口,它为您提供了一种方法,在以某种方式更新映像时调用回调方法。ImageObserver由java.

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

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

此外,它只是一个接口,提供了获取有关正在构造的图像对象信息的通知的方法。

根据,如果在图像仍处于构造阶段时对其调用getHeight()等,那么高度似乎并不真正“已知”,返回-1并通知提供的ImageObserver


是一个接口,它为您提供了一种方法,在以某种方式更新映像时调用回调方法。ImageObserver由java.awt.Component实现,因此如果在包含类中扩展该类,则可以重写imageUpdate(),并在异步调用函数时存储图像高度(如果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。obeserver,在您的例子中是后台实例-
g.drawImage(bkg,0,0,this)-将强制重新绘制背景,导致现在加载的图像被绘制

您还可以使用跟踪图像的状态


[]

您可以使用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;

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

但是图像是显示出来的,那么怎么可能不知道尺寸呢?这根本没有任何意义。我添加了图像,它被显示了,但是方法仍然返回-1。也许你应该在你的问题中添加一些代码,这样每个人都可以看到你在尝试做什么。和。第一个是我的Background类,它只是一个显示图像的JPanel。它需要一个映像路径。第二个是我的程序。按“Arkiv”,然后按“Ny”,选择一幅图像并观看它显示在中间。但是,JFrames path()不会对此做出反应(它不会调整JFrame的大小),因为不知何故,Bakgrund bg的大小是未知的。我怎样才能解决这个问题?我需要能够得到Bakgrund背景的大小,以便调整JFrame的大小以适应图片。有什么想法吗?请参阅上面的注释,粘贴了这些类。无论出于何种原因,这都起到了作用:更改发生在ImageIcon部分。谢谢你的帮助!