为什么我的图像不会显示在我的Java Applet中?

时间:2012-06-05 14:56:37

标签: java image applet

当我使用以下代码时:

    public void paint(Graphics g){

    //Displays version number and name.
    g.setFont(new Font("Courier", Font.PLAIN, 10));
    g.drawString("DCoder " + execute.Execute.version, 2, 10);

    //Displays logo in center.
    g.drawImage(logo, centerAlign(logo.getWidth(null)), 50, this);


}

private int width(){
    //Gets and returns width of applet.
    int width = getSize().width;
    return width;
}
private int height(){
    //Gets and returns height of applet.
    int height = getSize().height;
    return height;
}

private int centerAlign(int obWidth){
    int align = (width()-obWidth)/2;
    return align;
}

在我的Java Applet中,直到我调用repaint()(通过调整Applet Viewer窗口的大小),图像才会显示?为什么图像不显示?

2 个答案:

答案 0 :(得分:2)

因此必须处理异步加载的图像。

logo.getWidth(this); // Indicate asynchronous ImageObserver

...

@Override
public boolean imageUpdate(Image img,
              int infoflags,
              int x,
              int y,
              int width,
              int height) {
    if ((infoflags & ImageObserver.ALLBITS) == ImageObserver.ALLBITS) {
        // The image is entirely read.
        repaint();
    }
}

异步读取图像时,getWidth(null)将返回0,直到确定宽度为止。因此需要谨慎一点。


说明

加载图片的目的是异步完成。图片已经可用,但在阅读之前getWidth和/或getHeight为-1。您可以将ImageObserver传递给getWidth / getHeight,然后在图像读取期间通知它。现在JApplet已经是一个ImageObserver,所以你可以传递this

读取代码将传递/注册ImageObserver的方法imageUpdate来发出变化信号;宽度是已知的,SOMEBITS(=并非全部),因此可以绘制预览,就像在JPEG像素化预览中一样。

这种异步技术是在需要缓慢互联网的早期阶段。

如果您想更简单地阅读图像,请使用ImageIO.read(...)

答案 1 :(得分:1)

  

为什么图像不显示?

很可能是因为它是使用异步方法加载的。