Изменить значение поля со списком на основе выбранных флажков в Java Swing
Я пытаюсь связать JComboBox
группе JCheckBox
эс.
Есть 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}")
, Поведение осталось прежним.
Любые идеи о том, что я ошибаюсь в коде выше?