【问题标题】:how to change combobox's data after change another combobox item selection?更改另一个组合框项目选择后如何更改组合框的数据?
【发布时间】:2012-01-30 19:13:49
【问题描述】:

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

在触发其他事件后如何更改其他组件?

【问题讨论】:

    标签: java swing event-handling jcombobox comboboxmodel


    【解决方案1】:

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

    JComboBox monthCobmo;
    JComboBox daysCobmo;
    JComboBox yearCobmo;
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经实现了 itemlistener ,你能描述一下你的解决方案吗?
      • 问题不在于如何响应选择变化,而是如何根据不同组合框的状态改变一个组合框的内容。
      • @unholysampler,也许这个问题具有误导性?我相信这个答案是朝着正确方向的推动;真的不值得-1。
      • 我认为 mre 的建议是对 unholysampler 的补充。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 我不明白扩展默认模型的价值。你能放大吗?
        • 好的,我可以看到依赖模型如何监听其他模型并相应地更新自己。
        【解决方案5】:

        您可以更改依赖组合的模型,如 example 所示。

        或者,考虑JCalendar

        【讨论】:

        • 我喜欢组合,但它的扩展性很差,超过两三个组合的可用性也是如此。
        • IIUC,单个JCalendar 组件可能比三个单独的组合框更有用;它还具有很好的属性更改支持。
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-30
          • 1970-01-01
          • 2011-08-17
          • 2022-01-23
          相关资源
          最近更新 更多