Я пытаюсь связать JComboBox
с группой JCheckBox
es.
Есть 7 флажков (для каждого дня недели).Они связаны в JPanel
, который имеет приватное поле Map<DayOfWeek, JComboBox> checkBoxes
как с геттером, так и сеттером.Другой компонент простой JComboBox
со значениями из enum
, представляющими тип повторения (например, для настройки повторяющегося события в календаре).Допустим, значения этого enum
равны DAILY
, WEEKLY
EVERY_OTHER_WEEK
.
. Мне нужно, чтобы поле со списком изменилось на DAILY
, когда все 7 флажков выбраны, измените наWEEKLY
когда количество выбранных флажков уменьшается с 7 и тип повторения DAILY
и остается неизменным в противном случае.
Пока я пытался изменить поле со списком на DAILY
когда все 7 выбраны.Когда экземпляр контейнера (JDialog
) создается с выбранными всеми 7 днями, в качестве значения выбранного поля со списком устанавливается значение DAILY
(выполняется метод ниже convertForward()
).Однако после этого метод никогда не будет выполнен снова, независимо от того, какие флажки я выберу / отменил.
Добавление минимального примера приложения.Я ожидаю, что значение поля со списком изменится на DAILY
после того, как будут установлены два флажка.
RecurrenceType.java
package com.application;
public enum RecurrenceType {
NOT_SPECIFIED,
DAILY,
WEEKLY,
EVERY_OTHER_WEEK;
}
DaysSelectionPanel.java
package com.application;
import java.time.DayOfWeek;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
public class DaysSelectionPanel extends JPanel {
private Map<DayOfWeek, JCheckBox> checkBoxes;
public DaysSelectionPanel() {
initComponents();
this.checkBoxes = new HashMap<DayOfWeek, JCheckBox>() {{
put(DayOfWeek.MONDAY, mondayCheckBox);
put(DayOfWeek.TUESDAY, tuesdayCheckbox);
}};
}
public Map<DayOfWeek, JCheckBox> getCheckBoxes() {
return checkBoxes;
}
private JCheckBox mondayCheckBox;
private JCheckBox tuesdayCheckbox;
private void initComponents() {
mondayCheckBox = new JCheckBox();
tuesdayCheckbox = new JCheckBox();
add(mondayCheckBox);
add(tuesdayCheckbox);
}
}
JavaApplication.java (основной класс)
package com.application;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.Binding;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.Converter;
import java.time.DayOfWeek;
import java.util.Map;
import javax.swing.JCheckBox;
public class JavaApplication extends JFrame {
public JavaApplication() {
init();
}
private void init() {
setTitle("JavaApplication");
setSize(300, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
initComponents();
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JavaApplication app = new JavaApplication();
app.setVisible(true);
});
}
private DaysSelectionPanel daysSelectionPanel;
private JComboBox recurrenceTypeComboBox;
private BindingGroup bindingGroup;
private void initComponents() {
bindingGroup = new BindingGroup();
daysSelectionPanel = new DaysSelectionPanel();
recurrenceTypeComboBox = new JComboBox();
recurrenceTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(RecurrenceType.values()));
Binding binding = Bindings.createAutoBinding(
AutoBinding.UpdateStrategy.READ,
daysSelectionPanel,
recurrenceTypeComboBox,
BeanProperty.create("selectedItem"));
binding.setConverter(new Converter<DaysSelectionPanel, RecurrenceType>() {
@Override
public DaysSelectionPanel convertReverse(RecurrenceType value) {
return daysSelectionPanel;
}
@Override
public RecurrenceType convertForward(DaysSelectionPanel value) {
for(Map.Entry<DayOfWeek, JCheckBox> entry : value.getCheckBoxes().entrySet()) {
if(!entry.getValue().isSelected()) {
return (RecurrenceType) recurrenceTypeComboBox.getSelectedItem();
}
}
return RecurrenceType.DAILY;
}
});
bindingGroup.addBinding(binding);
setLayout(new GridBagLayout());
GridBagConstraints gridBagConstraints;
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.gridheight = 1;
add(daysSelectionPanel, gridBagConstraints);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.gridheight = 1;
add(recurrenceTypeComboBox, gridBagConstraints);
}
}
Я также пытался создать AutoBinding
с добавлением метода createAutoBinding()
перегрузка, включая sourceProperty
, а также ELProperty.create("${checkBoxes}")
.Поведение осталось прежним.
Есть идеи о том, что я ошибаюсь в приведенном выше коде?