Изменить значение поля со списком на основе выбранных флажков в Java Swing - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь связать 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}").Поведение осталось прежним.

Есть идеи о том, что я ошибаюсь в приведенном выше коде?

...