Отличный ответ.Я хотел бы расширить варианты, которые вы написали.Первый вариант: реализация модели кнопки с помощью PropertyChangeСоображения:1. ButtonModelWithPropertyChange может быть написан один раз для многих элементов управления, и его код не является логически частью кода класса клиента, поэтому он не добавляет сложности к коду класса клиента.2. Я принял ярлык написания кода синхронизации в установщик свойств, в то время как я должен был написать PropertyChange для свойства класса клиента и связать свойства вместе.Хотя второй является «стандартным» способом, мне кажется, что это много кода, и я больше заинтересован в этом решении, только если IDE, как Netbeans, сможет управлять им (как, вероятно, и есть).
//use static if you nest the class
public /*static*/ class ButtonModelWithPropertyChange extends ToggleButtonModel {
public static final String PROP_SELECTED = "test";
@Override
public void setSelected(boolean selected) {
boolean oldSelected = isSelected();
super.setSelected(selected);
propertyChangeSupport.firePropertyChange(PROP_SELECTED, oldSelected, selected);
}
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
public void addSelectedChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removeSelectedChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
}
И используйте его:
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.JToggleButton.ToggleButtonModel;
public class TestCheckBoxWithMVC extends JFrame {
public static void main(String [] args) {new TestCheckBoxWithMVC().setVisible(true);}
//my checkbox AND my "bounded" property
JCheckBox myCheckBox = new JCheckBox("my checkbox");
ButtonModelWithPropertyChange buttonModel;
public boolean myProperty;
//my button to test to assign the property and see the checkbox changed accordingly
JButton testBtn = new JButton("Assigning property directly");
public boolean isMyProerty() {
return myProperty;
}
//my property setter that sets the selected value of the model of the checkbox too
public void setMyProperty(boolean b) {
myProperty = b;
buttonModel.setSelected(b);
}
public TestCheckBoxWithMVC() {
super();
setLayout(new FlowLayout());
buttonModel = new ButtonModelWithPropertyChange();
buttonModel.addSelectedChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
myProperty = (Boolean)evt.getNewValue();
}
});
myCheckBox.setModel(buttonModel);
add(myCheckBox);
testBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setMyProperty(!isMyProerty());
}
});
add(testBtn);
pack();
}
//insert here the ButtonModelWithPropertyChange uncommenting static OR put it in
//an ad hoc file.
}