Модель данных JCheckBox, MVC - PullRequest
       0

Модель данных JCheckBox, MVC

2 голосов
/ 10 сентября 2011

Swing JCheckBox основан на MVC. Таким образом, я хочу, чтобы флажки в моем GUI использовали модель данных, которую предоставляет мой пользовательский класс.

То есть:

checkBox1 "привязан" к свойству isBackgroundShown
checkBox2 "привязан" к свойству isResizingEnabled

Флажки должны основываться на состоянии свойства, состояние свойства должно запускать обновление флажка, если оно было изменено.

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

на самом деле, у AbstractButtons нет «реальной» модели (которая должна быть доступна всем кнопкам) - у ButtonModel есть состояние просмотра для каждого экземпляра (нажатие, постановка на охрану), смешанное с более похожим на данные состоянием, подобным выбранному.Что еще хуже, выбранное свойство на кнопке выглядит только как связанное свойство (с установщиками и получателями), но не является (никогда не запускает propertyChange).

Ваши параметры:

  • реализуют ButtonModel, которая запускает PropertyChange при изменении выбранного и устанавливает его в JCheckBox, затем привязывает это новое свойство модели к вашему свойству данных
  • используйте Action в качестве промежуточного и привязывайте его Action.SELECTED_KEY к вашей модели данных.
  • реализует Адаптер поверх ButtonModel, который отображает changeEvents в propertyChangeEvents, если выбрано изменено
  • используйте aОбязательный каркас, который выполняет одно или другое автоматически (JGoodies Binding делает первое, BeansBinding - последнее)
0 голосов
/ 12 сентября 2011

Отличный ответ.Я хотел бы расширить варианты, которые вы написали.Первый вариант: реализация модели кнопки с помощью 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.    

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...