如果您只想收听此更改 - 使用 ItemListener (它甚至会收听由 ButtonGroup 更改或 setSelected 方法调用产生的事件):
checkBox.addItemListener ( new ItemListener ()
{
public void itemStateChanged ( ItemEvent e )
{
System.out.println (isSelected ());
}
} );
如果您只想从“UI”接收更改,或者添加一个 ActionListener。
但是,如果您真的想知道复选框如何从“UI”更改状态...
JCheckBox 只不过是一个简单的按钮,每个状态都有适当的图标,所以我们应该看到 JButton 事件
在 JButton 类中听鼠标没有任何意义——它隐藏在当前的 ButtonUI 中
在 BasicButtonUI 类中,您可以找到添加到其中的侦听器:
protected void installListeners(AbstractButton b) {
BasicButtonListener listener = createButtonListener(b);
if(listener != null) {
b.addMouseListener(listener);
b.addMouseMotionListener(listener);
b.addFocusListener(listener);
b.addPropertyChangeListener(listener);
b.addChangeListener(listener);
}
}
在鼠标释放时的 BasicButtonListener 中:
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
// Support for multiClickThreshhold
if (shouldDiscardRelease) {
shouldDiscardRelease = false;
return;
}
AbstractButton b = (AbstractButton) e.getSource();
ButtonModel model = b.getModel();
model.setPressed(false);
model.setArmed(false);
}
}
因此该事件被发送到按钮内部的 ButtonModel 集。要捕获它,您必须将按钮内的 ButtonModel 替换为您自己的:
check.setModel ( new DefaultButtonModel ()
{
public void setSelected ( boolean b )
{
super.setSelected ( b );
}
} );