3

我有一个用 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);
    }
}}

触发其他事件后如何更改另一个组件?

4

6 回答 6

3

You can change the dependent combos' models, as shown in this example.

Alternatively, consider JCalendar.

于 2011-12-30T20:26:33.887 回答
1

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

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

于 2011-12-30T20:23:49.627 回答
0

You can store the combobox in a map. Have a global variable like

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

In your createComboBoxes method, after you create a combox:

nameToComboxBox.put(comboBoxName, nameToComboBox);    

In the listener, you can update the day combobox:

case Helper.COMBOBOX_YEAR:
     year = Integer.parseInt(comboBox.getSelectedItem().toString().trim());
     JComboBox dayComboBox = nameToComboxBox.get("dayComboxBox");
     dayComboBox.setModel(new DefaultComboBoxModel(newDayItems));
     break;
于 2011-12-30T20:30:08.447 回答
0

您可以将组合框命名为字段,例如

JComboBox monthCobmo;
JComboBox daysCobmo;
JComboBox yearCobmo;

所以在itemStateChanged()编写以下代码:

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


        }
于 2011-12-30T20:19:33.830 回答
0

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

于 2011-12-30T20:19:41.313 回答
0

在选择年或月的情况下,您可以为月或日(取决于事件)实例化一个新的 JComboBox,并为其构造函数传递适当的值,然后更新 GUI 以反映更改。当然,JComboBoxes 必须实现ItemListener以检测事件并更新 GUI 中的适当元素。

于 2011-12-30T20:22:27.723 回答