Criar componentes Swing pode ser fácil!

Este blog deixou de ser mantido, mas o autor continua escrevendo aqui. Não deixe de assinar o novo feed!

Apenas um post rápido que mostra como é simples criar componentes Swing customizados.

Eu estava precisando de um componente para mostrar uma imagem. Bom, o JLabel já seria o suficiente. O problema é que as imagens são baixadas da Internet, processo este que pode demorar vários segundos, dependendo da conexão e do tamanho da imagem.

Como usabilidade é a palavra da vez, o componente então precisava avisar que a imagem está sendo carregada. Isso é fácil! Nada melhor do que a famigerada animaçãozinha da bolinha tipo as luzes do programa da Xuxa em preto e branco:

loading.gif

Obviamente, para que isso funcione, o download da imagem deve rodar em uma thread auxiliar.

O código:

  1.  
  2. package flickrdemo.gui;
  3.  
  4. import java.net.URL;
  5. import javax.swing.Icon;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.SwingWorker;
  8.  
  9. public class RemoteImage extends javax.swing.JLabel {
  10.    
  11.     private URL imageURL;
  12.     private Icon loadIcon = new ImageIcon(getClass().getResource("/img/loading.gif"));
  13.    
  14.     private boolean isLoading = false;
  15.    
  16.     public RemoteImage() {
  17.         setOpaque(false);
  18.     }
  19.    
  20.     public URL getImageURL() {
  21.         return imageURL;
  22.     }
  23.    
  24.     public void setImageURL(URL imageURL) {
  25.         this.imageURL = imageURL;
  26.         loadNewImageByURL();
  27.     }
  28.    
  29.     private void loadNewImageByURL() {
  30.        
  31.         if (imageURL == null) {
  32.             setIcon(null);
  33.         }
  34.         else {
  35.             if (!isLoading) {
  36.                
  37.                 isLoading = true;
  38.                 setIcon(loadIcon);
  39.                
  40.                 new SwingWorker() {
  41.                     protected Object doInBackground() throws Exception {
  42.                        
  43.                         ImageIcon icon = new ImageIcon(imageURL);
  44.                         setIcon(icon);
  45.                         return null;
  46.                     }
  47.                    
  48.                     protected void done() {
  49.                         isLoading = false;
  50.                     }
  51.                 }.execute();
  52.             }
  53.         }
  54.     }
  55. }
  56.  

O resultado

loading1.png

loading2.png

Legal, não?! Antes de implementar, pensei que ia dar o maior trabalho, mas nem sempre tudo é o que aparenta ser. Foi fácil, rápido e o resultado final ficou legal.

Caso queira baixar o código pronto, clique aqui. É necessário ter o Java 6.

Tags: , ,