Porque o evento de clique de um botão não é desativado ao desativar o botão?

package gui;

import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author maiko
 */
public class Teste {

    static JButton b = new JButton("Ativa/Desativa");

    public static void main(String[] args) {        
        b.addMouseListener(new java.awt.event.MouseAdapter() {

            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                bMouseClicked(evt);
            }

            private void bMouseClicked(MouseEvent evt) {
                if (b.isEnabled()) {
                    b.setEnabled(false);
                } else {
                    b.setEnabled(true);
                }
            }
        });

        showComponent(b, "Teste do Enable");
    }

    public static void showComponent(JComponent com, String title) {
        JFrame frm = new JFrame(title);
        JPanel panel = new JPanel();
        panel.add(com);
        frm.getContentPane().add(panel);
        frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }
}

Porque simplesmente não é desativado o evento do Botão ? Que coisa idiota viu, e como vou fazer o controle para o usuário não clicar em determinado componente em hora imprópria. Java pra GUI é sux.

Talvez utilizando o ActionListener, tu não terá esse problema. Isso acontece porque tu apenas desabilita o botão e não “desregistra” o componente do listener. Enquanto isso não acontecer, o listener irá notificar o botão, mesmo estando desativado. Um outra alternativa utilizar o método removeListener do componente.

Fernando

A princípio, um componente que está desabilitado, NÃO escuta aos eventos. De repente invocando o método revalidate(), após desabilitar seu botão, resolva.

Infelizmente não funciona nem revalidando o componente ou repintando todo o frame. Isso pra mim xera a bug, se eu desabilito algo é pra função deste algo ficar desabilitado e não somente pinta-lo de cinza.

Java GUI SUX!!!

“desresgistrando” o listener como o fernando disse

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Teste {

    static JButton b = new JButton("Ativa/Desativa");

    public static void main(String[] args) {   
        b.addMouseListener(new java.awt.event.MouseAdapter() {
            
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                bMouseClicked(evt);
            }

            private void bMouseClicked(MouseEvent evt) {
                if (b.isEnabled()){
                    b.setEnabled(false);
                    MouseListener [] listeners =  b.getMouseListeners();
                    for (int i = 0; i < listeners.length; i++) {
                        b.removeMouseListener(listeners[i]);
                    }
                   
                } else {
                    b.setEnabled(true);
                }
            }
        });

        showComponent(b, "Teste do Enable");
    }

    public static void showComponent(JComponent com, String title) {
        JFrame frm = new JFrame(title);
        JPanel panel = new JPanel();
        panel.add(com);
        frm.getContentPane().add(panel);
        frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }
}

maiko: o comportamento que você cita NÃO é um bug. Como disse o Fernando, o local certo para processar (ou não…) os cliques num botão, levando em conta o estado habilitado/desabilitado, é o ActionListener e não o MouseListener. O código abaixo mostra isso.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Teste {
  static JButton b = new JButton("Ativa/Desativa");

  public static void main(String[] args) {
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        bMouseClicked(evt);
      }

      private void bMouseClicked(ActionEvent evt) {
        if (b.isEnabled()) {
          b.setEnabled(false);
        } else {
          b.setEnabled(true);
        }
      }
    });

    showComponent(b, "Teste do Enable");
  }

  public static void showComponent(JComponent com, String title) {
    JFrame frm = new JFrame(title);
    JPanel panel = new JPanel();
    panel.add(com);
    frm.getContentPane().add(panel);
    frm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frm.pack();
    frm.setVisible(true);
  }
}