Estou com uma tela em swing com vários botões com ícones (png). Ao passar o Mouse, pela implementação do ouvinte FocusListener, a imagem que recebeu o foco será alterada para imagem com destaque (sombra, sublinhado, etc).
Eu devo implementar uma classe interna anônima para instanciar em cada chamada de método addListener ou devo criar uma classe interna regular para depois instanciar um único objeto para ser passado em todos os métodos addListener ?
No caso de usar uma única instância, como faria para manipular várias imagens diferentes?
Como usava netbeans para trabalhar com interface, ele sempre gerava o código com classes internas… Então… nunca tive que me preucupar com isso…
Agora… não se se funcionaria… más já pensou em dar um cast no source do evento? Talvez vc consiga dar um cast na sua imagem e trabalhar normalmente… Veja o método getSource() do evento se não me engano…
Posta ai pra saber!! =)
M
marcobiscaro2112
Pelo que entendi, você pode usar uma única classe comum para manipular todos os botões. Essa classe implementa FocusListener e uma instância dela será usada como listener para todos os botões necessários.
Dentro do método focusGained você faz um cast do evento.getSource() para um JButton. Com isso você terá acesso ao ícone através do getIcon(). Você pega o Icon, trata como necessário e depois define o novo Icon para o botão.
L
Lucas_Emanuel
marcobiscaro2112:
Pelo que entendi, você pode usar uma única classe comum para manipular todos os botões. Essa classe implementa FocusListener e uma instância dela será usada como listener para todos os botões necessários.
Dentro do método focusGained você faz um cast do evento.getSource() para um JButton. Com isso você terá acesso ao ícone através do getIcon(). Você pega o Icon, trata como necessário e depois define o novo Icon para o botão.
Obrigado, entendi o que você disse, e seria bem melhor do que criar uma classe interna anônima em cada método de adição de ouvinte.
Minha dúvida é: são pelo menos 15 botões (Na verdade JLabel com texto nulo só com ícone), como definir a troca de imagem para os 15 com única classe, sendo que cada botão receberá uma imagem diferente?
Grato
M
marcobiscaro2112
Isso irá depender de como seu programa estiver modelado e do que exatamente você fará. Por exemplo, você poderia fazer, dentro do focusGained:
Pega o source (getSource) do evento e faz um cast para JLabel.
Resgata o Icon (getIcon) do JLabel e faz um cast para ImageIcon.
Resgata a Image (getImage) do ImageIcon.
Pega os Graphics da Image.
Faz as alterações necessárias (por exemplo desenha um retângulo):
Graphics g = image.createGraphics().create();
g.drawRect(10, 10, 50, 50);
g.dispose();
Cria um novo ImageIcon a partir dessa nova Image.
Muda o Icon (setIcon) do seu JLabel para o novo ImageIcon criado.
Ah… você disse que são JLabel’s, certo? Eles estão recebendo foco?
L
Lucas_Emanuel
marcobiscaro2112:
Isso irá depender de como seu programa estiver modelado e do que exatamente você fará. Por exemplo, você poderia fazer, dentro do focusGained:
1. Pega o source (getSource) do evento e faz um cast para JLabel.
2. Resgata o Icon (getIcon) do JLabel e faz um cast para ImageIcon.
3. Resgata a Image (getImage) do ImageIcon.
4. Cria um BufferedImage para ser a nova imagem do JLabel.
5. Faz as alterações necessárias (por exemplo, desenha a imagem antiga e, por cima dela, um retângulo):
BufferedImage newImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g = newImage.createGraphics();
g.drawImage(image);
g.drawRect(10, 10, 50, 50);
g.dispose();
6. Cria um novo ImageIcon a partir dessa nova Image.
7. Muda o Icon (setIcon) do seu JLabel para o novo ImageIcon criado.
Ah... você disse que são JLabel's, certo? Eles estão recebendo foco?
Na verdade estou usando o MouseListener o código é mais ou menos assim: (mera reprodução)
JLabeliconCliente=newJLabel();iconCliente.setIcon(newImageIcon("img\\cliente.png");iconCliente.addMouseListener(newMouseListener{.....//as sobrescritaspublicvoidmouseEntrered(Evente){[b]iconCliente.setIcon(newImageIcon("img\\cliente_over.png");// No evento ao passar o mouse muda o ícone[/b]}//Aqui tem sobrescrita do método ao tirar o mouse - aí ele volta o ícone que estava antes, com setIcon também.});
Você acha que isso é POG?
Aí crio essas classes anonimas em cada um dos botões.
Abraço
M
marcobiscaro2112
Agora entendi.
Faça o seguinte, creio que seja melhor. Crie uma classe separada para manipular os ícones: