Uma das coisas mais curiosas em Java é o recurso de desenhar uma imagem em um painel. Assim é possível mudar o visual radicalmente e criar algumas animações.
Como exemplo estarei disponibilizando o código fonte do FaMap para demonstração, retirado de um programinha que fiz com fins acadêmicos, mas farei um breve comentário sobre suas particularidades para que haja um entendimento maior.
Desenhar uma imagem em um painel se dá da mesma forma que em um applet, usando-se a classe java.awt.Graphics, mas ao invés de usar-mos o método paint() usamos o método paintComponent() como mostrado abaixo:
protected void paintComponent( Graphics g ){}
Para desenhar-mos uma imagem em um painel usamos o conceito de Classes Internas Anônimas demonstrado em artigos anteriores onde a classe reescreve uma já existem. Neste caso iremos reescrever o objeto do painel a ser desenhado.
Primeiramente declaramos a existência do objeto do painel:
javax.swing.JPanel telaPrincipal;
Em seguida no construtor criamos a instância do objeto:
telaPrincipal = new JPanel();
Bom agora vamos reecrever abrindo e fechando uma chave logo em seguida dos parênteses do objeto para ser desenhado:
telaPrincipal = new JPanel(){
protected void paintComponent( Graphics g ){}
};
Pronto, agora é só desenhar como se fosse em um applet swing, o método paintComponent() recebe um objeto Graphics que deve ser utilizado de forma semelhante ao método paint() em um applet.
final ImageIcon img = new ImageIcon("imagem.png");
telaPrincipal = new JPanel(){
protected void paintComponent( Graphics g ){
super.paintComponent(g);
Rectangle rect;
for(int i=0; i< objects.size(); i++){
rect = (Rectangle) objects.elementAt(i);
img.paintIcon(this,g,0,0);
g.drawString("Exemplo imasters", 100, 120 );
}
}
};
Em seguida para que a imagem e a String “Exemplo imasters” apareçam pintados no painel devemos disparar um evento que execute essa mudança, assim preferi executar em um evento de botão logo na entrada do programinha, onde:
class ButtonHandlerEntrar implements ActionListener{
public void actionPerformed( ActionEvent e ){
Rectangle rect = new Rectangle(0,0,750,500);
objects.addElement(rect);
telaPrincipal.scrollRectToVisible(rect);
size.width = 1;
size.height = 1;
telaPrincipal.setPreferredSize(size);
telaPrincipal.revalidate();
telaPrincipal.repaint();
bEntrar.setVisible(false);
}
}
Esse evento adiciona uma nova área de um objeto retângulo onde é redimensionado e repintado com o método repaint() que irá acionar o método paintComponent() e executará os seus comandos internos fomando a imagem.
Devo avisar que as imagens estarão sendo desenhadas em um objeto do tipo Rectangle que definirá o tamanho da área a ser pintada de acordo com os objetos desenhados nessa área.
Desenhado Ícones no lugar de Botões
O esquema utilizado foi o seguinte:

Foi adicionado ao painel um evento de clique de mouse onde é capturada a posição X e a posição Y no painel, assim com operadores condicionais if detectamos a localização exata da área onde foi disparado o evento de clique de mouse. Satisfazendo as condições executa-se outro evento desejado. Dessa forma desenhamos um ícone e mapeamos a sua posição de acordo com o seu tamanho e ao clicar na imagem e é disparado um evento assemelhando-se muito aos eventos de botão.
Da forma como estou exemplificando, construir um sistema com muitas telas além de ser muito trabalhoso iria ter um péssimo desempenho de performance devido ao grande número de imagens carregadas e ao grande número de operações de desenho que seriam efetuados, mas com uma orientação a objeto bem feita essa dificuldade de construção e a perda de desempenho pode ser diminuída drasticamente, mas por equanto vamos nos reter apenas aos conceitos de desenho deixando livre aos leitores usar a orientação a objeto da forma como preferirem.
Resultado Final
Aqui vamos mostrar as imagens de como ficou um pequeno sistema de localização acadêmica de salas, professores e disciplinas.
As imagens abaixo são do sisteminha completo que fiz, mas desponibilizei apenas a parte inicial dele para análises de todos, o resto do fonte foi retirado para que não fique muito complexo o exemplo.
Entrada
Aqui foi colocado um botão do tamanho da tela para que o evento de desenho seja disparado, mas podemos acionar um evento de surgimento de tela que ao mostrar a tela do sistema ela já apareceria desenhada.

Menu de opções do usuário
Inicialmente aos usuários em terminais de consulta foram disponibilizados apenas algumas opções para facilitar a sua utilização.

Opção de pesquisa por professores
Aqui podemos escolher um professor cadastrado que aparecerá o nome em um combo e o prorgrama nos mostrará onde ele estará lecionando, qual a disciplina, dia e horário.

Opção de localização de salas
Aqui o usuário pode localizar e identificar todas as salas do campus universitário.
Detalhe, o usuário tem a opção de clicar direto na imagem da sala no mapa e será acionado e evento que mostrará quem ela é, não sendo preciso a consulta direto no combo. Dessa forma o usuário interage direto com a imagem, como em todo o sitema.

Com ZOOM na imagem

Deslocamento a Direta

Opção de localização de disciplinas
Aqui o usuário tem a possibilidade de saber onde a disciplina desejada estará sendo lecionada, o horário, dia e qual o professor.
Novamente lembrando que em todo o sistema o usuário tem a opção de interagir com a imagem, não sendo necessário em determinadas consultar a utilização dos combos e sim apenas clicando na imagem da sala correspondente.

Créditos
Aqui foram mostrados os créditos do trabalho e uma homenagem amigável ao professor da disciplina naquele semestre.

Conclusão
Aos apaixonados por Java gostaria de mostrar mais uma vez o poder que essa linguagem tem e que com esses pequenos conceitos poderemos concretizar grandes idéias.
Sem mais nada a dizer, um abraço a todos.
Java é lindo!
Os textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
Almedson Ferreira trabalha com Java há 4 anos e atualmente é deselvolvedor das Agroíndústrias do Vale do São Francisco - AGROVALE, maior usina de cana de açúcar do país.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.