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.
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.
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);
}
}