как изменить данные в выпадающем списке после изменения выбора другого элемента в выпадающем списке? - PullRequest
3 голосов
/ 31 декабря 2011

У меня есть приложение MVC, написанное на Java, в котором есть форма с тремя выпадающими списками. год / месяц / день, и я хочу изменить количество дней, если выбор года и месяца изменился. в моем окне просмотра я просто определяю поля со списком

createComboBoxes( mainContentPage, "combobox name");

в моем контроллере у меня есть:

public class ComboBoxItemListener implements ItemListener
{

private int year=0;
private int month=0;
private int day=0;

public WeatherController c_wc;
@Override
public void itemStateChanged(ItemEvent event)
{


    JComboBox comboBox = (JComboBox)event.getSource();
    if (event.getStateChange() == ItemEvent.SELECTED)
    {
                    //this area is my problem
        if(comboBox.getName() == Helper.COMBOBOX_MONTH || comboBox.getName() == Helper.COMBOBOX_YEAR)
        {
                    //definitely this line is not correct
                c_wc.addDaysToComboBox(comboBox, year, month);
                comboBox.setEnabled(true);


        }
        //rest is okay
        switch(comboBox.getName())
        {
            case Helper.COMBOBOX_YEAR:
                year = Integer.parseInt(comboBox.getSelectedItem().toString().trim());

                break;

            case Helper.COMBOBOX_MONTH:
                KeyValue<String, Integer> selectedItem = (KeyValue<String,Integer>)event.getItem();

                month = Integer.parseInt(selectedItem.getValue().toString());
                break;

            case Helper.COMBOBOX_DAY:
                day = Integer.parseInt(comboBox.getSelectedItem().toString().trim());
                break;

            case Helper.COMBOBOX_AIRPORT:
                break;
        }
        System.out.println(year + " " + month + " " + day);
    }
}}

как я могу изменить другой компонент после запуска другого события?

Ответы [ 6 ]

3 голосов
/ 31 декабря 2011

Вы можете изменить модели зависимых комбо, как показано в этом примере .

В качестве альтернативы рассмотрите JCalendar.

1 голос
/ 31 декабря 2011

Вы можете создать собственную модель поля со списком для поля со списком дня.На основе выбранного значения поля со списком года и месяца вы можете перевести модель поля со списком дней в правильное состояние, чтобы отобразить соответствующее количество дней.Самый простой способ расширения DefaultComboBoxModel.

Редактировать:
Создание пользовательской модели позволяет более легко переключаться между вариантами.Месяц может иметь 28, 29, 30 или 31 день.У пользовательского класса может быть один метод, который устанавливает, сколько дней отображать, и не требует дополнительной работы извне.Другой вариант - создать набор опций в вашем обработчике событий и заменять модель каждый раз, когда вносятся изменения.Пользовательский класс разбивает код на части так, чтобы обработчик событий просто устанавливал, сколько дней будет отображаться, и не нужно заботиться о том, как это влияет на базовую модель данных.

0 голосов
/ 31 декабря 2011

Вы можете хранить комбинированный список на карте.Глобальная переменная, такая как

Map<String,JComboBox> nameToComboBox = new HashMap<String,JComboBox>();

В вашем методе createComboBoxes после создания комбокса:

nameToComboxBox.put(comboBoxName, nameToComboBox);    

В слушателе вы можете обновить комбинированный список дня:

case Helper.COMBOBOX_YEAR:
     year = Integer.parseInt(comboBox.getSelectedItem().toString().trim());
     JComboBox dayComboBox = nameToComboxBox.get("dayComboxBox");
     dayComboBox.setModel(new DefaultComboBoxModel(newDayItems));
     break;
0 голосов
/ 31 декабря 2011

В случае выбора года или месяца вы можете создать новый JComboBox для месяцев или дней (в зависимости от события) с соответствующими значениями, переданными для его конструктора, а затем обновить GUI, чтобы отразить изменение.Конечно, JComboBoxes должен реализовывать ItemListener для обнаружения события и обновления соответствующих элементов в графическом интерфейсе.

0 голосов
/ 31 декабря 2011

Ваши комбинированные списки должны будут реализовать интерфейс ItemListener и зарегистрировать себя в качестве слушателей соответствующих компонентов.

0 голосов
/ 31 декабря 2011

Вы можете именовать комбинированные списки в виде полей, таких как

JComboBox monthCobmo;
JComboBox daysCobmo;
JComboBox yearCobmo;

Итак, в itemStateChanged() напишите следующий код:

if(comboBox == monthCombo || comboBox== yearCombo)
        {
                daysCombo.setName("Bla-bla-bla");


        }
...