Classe Interna Anônima ou Regulares para Evento?

Bom,

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?

Grato

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!! =)

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.

[quote=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.[/quote]

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

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. Pega os Graphics da Image.
  5. 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();
  1. Cria um novo ImageIcon a partir dessa nova Image.
  2. 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?

[quote=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();
  1. Cria um novo ImageIcon a partir dessa nova Image.
  2. 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?[/quote]

Na verdade estou usando o MouseListener o código é mais ou menos assim: (mera reprodução)

[code]

JLabel iconCliente = new JLabel();
iconCliente.setIcon(new ImageIcon(“img\cliente.png”);
iconCliente.addMouseListener( new MouseListener{

…//as sobrescritas

public void mouseEntrered (Event e ){

iconCliente.setIcon(new ImageIcon(“img\cliente_over.png”); // No evento ao passar o mouse muda o ícone

}

//Aqui tem sobrescrita do método ao tirar o mouse - aí ele volta o ícone que estava antes, com setIcon também.

});[/code]

Você acha que isso é POG?

Aí crio essas classes anonimas em cada um dos botões.

Abraço

Agora entendi.

Faça o seguinte, creio que seja melhor. Crie uma classe separada para manipular os ícones:

public class IconMouseListener extends MouseAdapter {

	private JLabel component;
	private Icon icon;
	private Icon iconOver;

	public IconMouseListener(JLabel component, Icon icon, Icon iconOver) {
		this.component = component;
		this.icon = icon;
		this.iconOver = iconOver;
	}
	
	public void mouseEntered(MouseEvent e) {
		component.setIcon(iconOver);
	}
	
	public void mouseExited(MouseEvent e) {
		component.setIcon(icon);
	}

}

E na hora de criar seu JLabel:

private JLabel createLabelCliente() {
	JLabel labelCliente = new JLabel();
	Icon icon = new ImageIcon("img/client.png");
	Icon iconOver = new ImageIcon("img/client_over.png");
	labelCliente.setIcon(icon);
	labelCliente.addMouseListener(new IconMouseListener(labelCliente, icon, iconOver));
	return labelCliente;
}

Sempre que possível procure separar as responsabilidades.

[quote=marcobiscaro2112]Agora entendi.

Faça o seguinte, creio que seja melhor. Crie uma classe separada para manipular os ícones:

public class IconMouseListener extends MouseAdapter {

	private JLabel component;
	private Icon icon;
	private Icon iconOver;

	public IconMouseListener(JLabel component, Icon icon, Icon iconOver) {
		this.component = component;
		this.icon = icon;
		this.iconOver = iconOver;
	}
	
	public void mouseEntered(MouseEvent e) {
		component.setIcon(iconOver);
	}
	
	public void mouseExited(MouseEvent e) {
		component.setIcon(icon);
	}

}

E na hora de criar seu JLabel:

private JLabel createLabelCliente() {
	JLabel labelCliente = new JLabel();
	Icon icon = new ImageIcon("img/client.png");
	Icon iconOver = new ImageIcon("img/client_over.png");
	labelCliente.setIcon(icon);
	labelCliente.addMouseListener(new IconMouseListener(labelCliente, icon, iconOver));
	return labelCliente;
}

Sempre que possível procure separar as responsabilidades.[/quote]

Perfeito.

Obrigado.