Java Applet é comumente usado para exibir imagens armazenadas em arquivos GIF. É muito simples carregar imagens GIF no Java Applet. Ao usar arquivos de imagem no Applet, você precisa definir o objeto Image. A maioria dos miniaplicativos Java usa arquivos de imagem no formato GIF ou JPEG. O Applet usa o método getImage para associar o arquivo de imagem ao objeto Image.
O método drawImage da classe Graphics é usado para exibir objetos Image. Para melhorar o efeito de exibição das imagens, muitos miniaplicativos usam tecnologia de buffer duplo: primeiro carregue a imagem na memória e depois exiba-a na tela.
O miniaplicativo pode determinar quanto de uma imagem já está na memória por meio do método imageUpdate.
Carregando uma imagem
Java trata as imagens como objetos de imagem, portanto, ao carregar uma imagem, você precisa primeiro definir o objeto de imagem. O formato é o seguinte:
Imagem de imagem
e então usar o método getImage para conectar o objeto de imagem e o arquivo de imagem:
imagem=getImage(getCodeBase( ),"ImageFileName.GIF");
O método getImage possui dois parâmetros. O primeiro parâmetro é uma chamada ao método getCodeBase, que retorna o endereço URL do miniaplicativo, como www.sun.com/Applet . O segundo parâmetro especifica o nome do arquivo de imagem a ser carregado do URL. Se o arquivo de imagem estiver localizado em um subdiretório do Applet, o caminho do diretório correspondente deverá ser incluído no nome do arquivo.
o
método drawImage da classe Graphics para exibir a imagem. O formato é o seguinte:
g.drawImage(Picture,x,y,this);
especifique a imagem a ser exibida. As coordenadas xey do canto superior esquerdo da imagem e isto.
O objetivo do quarto parâmetro é especificar um objeto que implemente a interface ImageObServer, ou seja, um objeto que defina o método imageUpdate (este método será discutido posteriormente).
Imagem de exibição (ShowImage.java)
//Lista de programas de origem
importar java.awt.*;
importar java.applet.*;
classe pública ShowImage estende miniaplicativo
Image picure; //Definir variáveis de membro do tipo Image
inicialização pública nula()
{
picture=getImage(getCodeBase(),"Image.gif"); //Carregar imagem
}
pintura vazia pública (gráficos g)
{
g.drawImage(imagem,0,0,this); //Exibir imagem
}
}
Por esta razão, as declarações sobre o Applet no arquivo HTML são as seguintes:
<HTML>
<TITLE>Mostrar miniaplicativo de imagem</TITLE>
<APPLET
CODE="ShowImage.class" //O nome do arquivo da classe é ShowImage.class
LARGURA=600
ALTURA=400>
</APLICATIVO>
</HTML>
Ao executar o miniaplicativo após a compilação, a imagem não aparece de uma só vez. Isso ocorre porque o programa não carrega e exibe a imagem completamente antes do retorno do método drawImage. Por outro lado, o método drawImage cria um thread que é executado simultaneamente com o thread de execução original do Applet. Ele é carregado e exibido ao mesmo tempo, criando assim essa descontinuidade. Para melhorar o efeito de exibição. Muitos miniaplicativos utilizam tecnologia de buffer duplo de imagem, ou seja, a imagem é totalmente carregada na memória e depois exibida na tela, para que a imagem possa ser exibida de uma só vez.
Imagens com buffer duplo
Para melhorar o efeito de exibição das imagens, a tecnologia de buffer duplo deve ser usada. A imagem é primeiro carregada na memória e depois exibida na janela do miniaplicativo.
Exemplo de uso da tecnologia de imagem com buffer duplo (BackgroundImage.java)
//Lista de programas de origem
importar java.awt.*;
importar java.applet.*;
classe pública BackgroundImage estende miniaplicativo //Herdar miniaplicativo
{
Imagem da imagem;
Boolean ImageLoaded=falso;
inicialização pública nula()
{
picture=getImage(getCodeBase(),"Image.gif"); //Carregar imagem Imagem offScreenImage=createImage(size().width,size().height);
//Cria objeto Gráfico usando o método createImage offScreenGC=offScreenImage.getGraphics(); //Obtém objeto Gráfico offScreenGC.drawImage(picture,0,0,this);
pintura vazia pública (gráficos g)
{
if(ImageLoaded)
{
g.drawImage(picture,0,0,null); //Exibir imagem, o quarto parâmetro é nulo, não este
showStatus("Concluído");
}
outro
showStatus("Carregando imagem");
}
public boolean imageUpdate(Imagem img,int infoflags,int x,int y,int w,int h)
{
if(infoflags==ALLBITS)
{
imagemLoaded=true;
repintar();
retornar falso;
}
outro
retornar verdadeiro;
}
}
A análise do método init do Applet mostra que o método primeiro define um objeto Image chamado offScreenImage e atribui a ele o valor de retorno do método createImage e, em seguida, cria um objeto Graphics chamado offScreenGC e atribui a ele um ambiente gráfico - um ambiente sem tela imagem será produzida por ele. Como a imagem fora da tela é desenhada aqui, nenhuma imagem será exibida na janela do miniaplicativo.
Sempre que o miniaplicativo chamar o método drawImage, drawImage criará um thread que chama o método imageUpdate. O miniaplicativo pode determinar quanto da imagem foi carregada na memória no método imageUpdate. O thread criado por drawImage continua chamando o método imageUpdate até que o método retorne falso.
O segundo parâmetro infoflags do método imageUpdate permite que o Applet saiba como a imagem é carregada na memória. Este parâmetro é igual a ImageLoaded e é definido como true e o método repaint é chamado para redesenhar a janela do Applet. Este método eventualmente retorna false para evitar que o thread de execução drawImage chame o método imageUpdate novamente.
O funcionamento do Applet no método paint é controlado pela variável ImageLoaded. Quando esta variável se torna verdadeira, o método paint chama o método drawImage para exibir a imagem. Quando o método paint chama o método drawImage, ele recebe null como o quarto parâmetro, o que impede que drawImage chame o método imageUpdate. Como a imagem foi carregada na memória neste momento, a exibição da imagem na janela do miniaplicativo pode ser concluída de uma só vez.