2012-06-05 2 views
0

Когда я использую следующий код:Почему мой образ не отображается в моем Java-апплете?

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-апплета, то изображение не будет отображаться, пока я не позову перекрасить() (при изменении размера окна апплета просмотра)? Почему изображение не будет отображаться?

+1

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

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 до ширина определяется Etcetera. Поэтому нужно быть немного осторожным.


Объяснение

Загрузка изображений был разработан, чтобы сделать асинхронно. Изображение уже доступно, но перед чтением getWidth и/или getHeight равно -1. Вы можете передать ImageObserver в getWidth/getHeight, который затем уведомляется во время чтения изображения. Теперь JApplet уже является ImageObserver, поэтому вы можете просто пройти this.

Код чтения будет передан/зарегистрирован метод ImageObserver метода imageUpdate, чтобы сигнализировать об изменении; что ширина известна, что SOMEBITS (= не все), поэтому можно уже сделать предварительный просмотр, как в пиксельном просмотре JPEG.

Эта техника асинхронов была в ранние дни медленного интернета.

Если вы хотите прочитать изображение проще, используйте ImageIO.read(...).

+0

Какой метод imageUpdate пытается показать мне? Все равно, спасибо за помощь. – Cin316

+0

При чтении изображения код чтения будет вызывать этот метод с помощью разных [infoflags] (http://docs.oracle.com/javase/7/docs/api/java/awt/image/ImageObserver.html). Например, при первом вызове известна только ширина (WIDTH), чуть позже также ВЫСОТА. Это позволяет компоновать изображение, и когда он, наконец, вызывается с ALLBITS, вы можете его полностью рисовать. –

+0

Я до сих пор не понимаю, как использовать этот код для получения ширины. Можете ли вы объяснить дальше? – Cin316

1

Почему изображение не отображается?

Скорее всего, он был загружен с использованием асинхронного метода.

Смежные вопросы