I would also.
If clicking on the checkbox starts some action, I will add an ItemListener , and then just look at the selection state in the ItemEvent .
However, flags, as a rule, do not cause actions; they control the state. Therefore, it is best to consider all of your checkboxes in response to everything that starts with an action.
Edit: some comments about the larger issues raised by the OP.
First, it’s important to understand that large parts of Swing are usability, not a model of consistent behavior. JCheckBox and JButton have nothing ordinary than the fact that clicking in their space makes sense. However, they both inherit from AbstractButton , which provides implementation details such as a button shortcut. It also assumes that the buttons are “pressed” and that pressing the button initiates some meaningful behavior (action). However, in the case of JCheckbox, pressing a button does not matter, a change of state. This state change is signaled by an ItemListener, which is also defined in AbstractButton, although state changes do not make sense for other types of buttons (JavaDoc even says "checkbox").
One of the things Swing did right — if it's hard to use — is the idea that the Action is separate from the control that triggers the action. An Action object can be called up from several controls: a menu item, a button in a dialog box, a keystroke, anything. More important from a design point of view is that it takes you away from the idea of a general “listener” who is trying to figure out what is going to happen. I saw applications in which one listener receives input from the entire menu system, for example, and then goes through a large if / else chain to find out which menu item was clicked. Using "Actions" means you have more classes, but ultimately gives you a more convenient application.
Finally, in terms of usability, there is a difference between controls that support state, such as JCheckbox and JTextArea, and those that trigger actions, such as JButton and JMenuItem. I saw an application (web application) in which clicking on the switch takes you to another page. This is bad. Even if you plan to use internal listeners to update the state of a model, you should ask yourself why the collection of GUI elements alone does not provide you with a model.