更改另一个组合框项目选择后如何更改组合框的数据?

时间:2011-12-30 20:11:46

标签: java swing event-handling jcombobox comboboxmodel

我有一个用java编写的MVC应用程序,其中包含一个包含三个组合框的表单。 年/月/日,如果年份和月份的选择发生变化,我想更改天数。 在我的观察器中,我只是定义了组合框

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 个答案:

答案 0 :(得分:3)

您可以更改相关组合的模型,如example

所示

或者,请考虑JCalendar

答案 1 :(得分:1)

您可以为日期组合框创建自己的组合框模型。根据年份和月份组合框的选定值,您可以将日期组合框模型设置为正确的状态,以显示适当的天数。扩展DefaultComboBoxModel的最简单方法。

编辑:
创建自定义模型使您可以更轻松地在选项之间进行更改。一个月可以有28天,29天,30天或31天。自定义类可以有一个方法来设置显示的天数,并且不需要外部的任何额外工作。另一个选项是在事件处理程序中创建一组选项,并在每次更改时替换模型。自定义类对代码进行分区,以便事件处理程序只设置显示的天数,而不需要关心如何影响数据的基础模型。

答案 2 :(得分:0)

您可以将命名组合框命名为

之类的字段
JComboBox monthCobmo;
JComboBox daysCobmo;
JComboBox yearCobmo;

所以在itemStateChanged()写下面的代码:

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


        }

答案 3 :(得分:0)

你的组合框需要实现ItemListener接口并将自己注册为适当组件的监听器。

答案 4 :(得分:0)

如果选择年份或月份,您可以使用为其构造函数传递的适当值来实例化数月或数天的新JComboBox(取决于事件),然后更新GUI以反映更改。当然,JComboBox必须实现ItemListener来检测事件并更新GUI中的相应元素。

答案 5 :(得分:0)

您可以将组合框存储在地图中。 有一个像

这样的全局变量
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;