JCheckbox mudança ouvinte é notificado do mouse sobre eventos
-
19-09-2019 - |
Pergunta
Pode alguém por favor me explicar por que este pedaço de impressões de código para o console quando você move o mouse sobre a caixa de seleção? Qual é a "mudança" evento que acontece?
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame();
JCheckBox c = new JCheckBox("Print HELLO");
c.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
System.out.println("HELLO");
}
});
f.getContentPane().add(c);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
NOTA: Não uso um ouvinte de ação, porque no meu programa eu quero ser capaz de fazer:
checkBox.setSelected(boolean)
e ter o meu ouvinte notificado, o que não pode ser feito com um ouvinte de ação. Então, há uma maneira de desativar este "rato sobre" evento ou outra maneira que eu posso implementar o meu ouvinte?
Solução
Você recebe eventos do mouse sobre como foco ganhos / perdidos representa uma mudança para o estado do componente.
Em vez disso, você poderia usar um ItemListener que lhe dará ItemEvents.
O objeto que implementa a interface ItemListener recebe este ItemEvent quando ocorre o evento. O ouvinte é poupado os detalhes de processamento de movimentos e cliques do rato individual e em vez disso pode processar um evento "significativo" (semântica) como "item selecionado" ou "ponto desmarcada".
Você pode adicionar à sua caixa com o método addItemListener () na classe AbstractButton. Basta substituir addChangeListener com este:
c.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
System.err.println(e.getStateChange());
}
});
Outras dicas
Use c.setRolloverEnabled(false
) `e você não vai obter qualquer evento para movimentos do mouse.
O estado da caixa de seleção (mesmo apenas o modelo de caixa de seleção) muda dependendo se ele tem o mouse sobre ele ou não. Portanto, um evento de mudança de estado deve ser esperado.
Assim, apenas volte para ver em que estado a caixa de seleção está dentro e atualização em conformidade. É melhor ir direto para o modelo, ao invés de usar a interface do componente "inchado".