Porque não estou conseguindo adicionar o mouselistener no botão?

Olá, eu criei uma biblioteca, e nela coloquei uma classe com um método com o objetivo de aplicar determinadas propriedades em todo component do tipo jbutton que fosse adicionado ao container do parâmetro, tudo funciona corretamente exceto o mouse listener, alguém pode me explicar porque o mouse listener não funciona?
Meu código:
`

package LookAndFeel;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JButton;

public class FormataComponents {
 public void formatar(Container c){
         ArrayList<Component> list = new ArrayList<Component>();
           for(int i = 0; i<=c.getComponentCount()-1; ++i){
             Component component = c.getComponent(i);
             if(component instanceof JButton){
                   list.add(component);
	         component.setBackground(Color.RED);
                                    ((JButton) component).setBorderPainted(false);
                                    component.setFocusable(false);
                                    component.addMouseListener(new MouseListener(){
                                          Dimension dn = new Dimension(0,0);
                                          public void mouseReleased(MouseEvent arg0) {
                                                  component.setSize(dn);
                                                  c.validate();
                                          }
                                          public void mousePressed(MouseEvent arg0) {
                                                  component.setSize(component.getWidth()-10,component.getHeight()-10);
                                                  c.validate();
                                          }
                                          public void mouseExited(MouseEvent arg0) {
                                                  component.setSize(dn);
                                                  c.validate();
                                          }
                                          public void mouseEntered(MouseEvent arg0) {
                                                  dn = new Dimension(component.getWidth(),component.getHeight());
                                                        component.setSize(component.getWidth()+5,component.getHeight()+5);
                                                  c.validate();
                                          }
                                          public void mouseClicked(MouseEvent arg0) {
                                          }
                                    });
                                    c.validate();
	          }
	}
            new Thread(new Runnable(){
                public void run(){
                    while(true){
                      c.validate();
                      for(int i = 0; i<=c.getComponentCount()-1; ++i){
                          Component atual = c.getComponent(i);
                           if(!list.contains(atual)){
                              list.add(atual);
                              if(atual instanceof JButton){
                                    atual.setBackground(Color.RED);
                                    ((JButton) atual).setBorderPainted(false);
                                    atual.setFocusable(false);
                                    atual.addMouseListener(new MouseListener(){
                                            Dimension dn = new Dimension(0,0);
                                          public void mouseReleased(MouseEvent arg0) {
                                                  atual.setSize(dn);
                                                  c.validate();
                                          }
                                          public void mousePressed(MouseEvent arg0) {
                                                  atual.setSize(atual.getWidth()-10,atual.getHeight()-10);
                                                  c.validate();
                                          }
                                          public void mouseExited(MouseEvent arg0) {
                                                  atual.setSize(dn);
                                                  c.validate();
                                          }
                                          public void mouseEntered(MouseEvent arg0) {
                                                  dn = new Dimension(atual.getWidth(),atual.getHeight());
                                                  atual.setSize(atual.getWidth()+5,atual.getHeight()+5);
                                                  c.validate();
                                          }
                                          public void mouseClicked(MouseEvent arg0) {
                                          }
                                    });
                                    c.validate();
                               } 
                           }
                      }
                  }
                }
            }).start();
         }
  }

`

Vc verificou se funciona?

coloca um System.out em cada evento para verificar
exemplo

public void mouseReleased(MouseEvent arg0) {
    System.out.println("Executando MouseReleased");
    component.setSize(dn);
    c.validate();
}

O setSize não costuma funcionar se o container parent tiver um layout.
Se vc quer sumir com o botão, então use setVisible ao inves de setSize.

Nunca use c.validate, nesse seu código isto é inútil, se precisar, use c.repaint, pois é melhor.

Olá, eu já testei e os eventos estão funcionando, o problema está no setSize, antes de criar esta biblioteca eu já havia criado muitas outras classes utilizando essa mesma técnica para alterar o tamanho do botão e sempre funcionou, então eu não sei porque que não funciona. E você poderia me explicar a diferença de validade e repaint?

O setSize não costuma funcionar se o container parent tiver um layout.
Se vc quer sumir com o botão, então use setVisible ao inves de setSize.

Mas se ainda quiser assim, então identifique qual é esse layout do container parent e se é possível alterar o tamanho do botao.

Vc pode fazer um TESTE removendo o layout

component.getParent().setLayout(null); // TESTE
component.setSize(dn);

O validate é usado para validar o component, isso acontece pq ele é sempre criado como inválido. Então quando o component for exibido, é verificado se o component já foi validado, se não foi, então o layout valida o component. Usar o validade influencia o próprio component, os componets “irmãos” (todos os botões no caso do seu código), os componets filhos e o container parent.

Alguns components não atualizam automaticamente, o repaint serve para repintar o component, bastante útil quando alguma informação do component foi alterada.

Os setSize, setBackground, setBorderPainted, …, não precisam do validade e do repaint, pois praticamente todos os metodos set atualizam automaticamente o component quando necessários, portanto desnecessário no seu código.

1 curtida

Muito obrigado pelas explicações mais sobre o setsize eu já usei ele em um flowlayout em outro projeto e funcionou, porém não era através de uma biblioteca e sim por uma classe do próprio projeto, eu fiz um teste, criei outra biblioteca com uma classe que no seu construtor recebe um jbutton como parâmetro e então eu aplico o mouse listener da mesma maneira e funciona independente do layout, mais se para o meu caso devo usar layout nulo você não conhece outra alternativa ao setsize?

Eu disse que era TESTE, funcionou? Se sim então o problema é do layout. Os layouts podem alterar ou impedir q os components mudem de tamanho.

Tem mais, as vezes o problema pode estar no layout do container parent do container parent do component, ou seja, pode estar em qualquer antecessor.

Usar o setVisible costuma funcionar melhor do que setSize(Dimension(0, 0)), teste e veja se funciona, ou o que acontece.

Eu não entendia porque você falava no setVisible, agora eu entendi, mais testa esse mouse listener em qualquer classe para você ver, ele não serve para deixar o component invisível, ele aumenta o tamanho do botão quando o mouse passa por cima e diminui quando ele sai e quando o botão é clicado ele diminui e depois aumenta o tamanho

A e é verdade que com o layout nulo funciona mais eu não posso usar layout nulo

Resolvi!!!
A unica coisa que eu fiz foi retirar todos os validates da classe e agora funciona em qualquer layout, muito obrigado pela ajuda :slight_smile:.

Então era por causa disso, o validate chama o layout pedindo para validar os components, dependendo do layout ele altera o tamanho e posição.

1 curtida