2011-12-30 4 views
3

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

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); 
    } 
}} 

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

+0

что было -rep для? –

ответ

0

Вы можете назвали выпадающие списки, как поля, как

JComboBox monthCobmo; 
JComboBox daysCobmo; 
JComboBox yearCobmo; 

Так в itemStateChanged() записи следующего кода:

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


     } 
0

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

+0

Я внедрил itemlistener, могу ли описать ваше решение? –

+0

+1 для шаблона наблюдателя. – trashgod

+0

Вопрос не в том, как реагировать на изменения выбора, а в том, как изменить содержимое одного поля со списком в зависимости от состояния другого. – unholysampler

0

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

1

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

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

+0

Я не понимаю значение _extending_ модели по умолчанию. Можете ли вы усилить? – trashgod

+0

@trashgod: см. Править. – unholysampler

+0

Хорошо, я вижу, как зависимая модель может слушать другие модели и соответственно обновлять ее. – trashgod

3

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

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

+0

+1 Для предложения 'JCalendar'. – mre

+0

Я предпочитаю композицию для этого, но она плохо масштабируется, как и удобство использования более двух или трех комбо. – trashgod

+0

какой календарь ...? Я просто слышал или читал его точно? – gumuruh

0

Вы можете сохранить combobox на карте. Иметь глобальную переменную, как

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

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

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; 
Смежные вопросы