ComboBox.setModel将数组作为单个项插入

时间:2012-07-12 21:59:45

标签: java jcombobox

我有一个带有三个组合框的GUI设置,其中组合框1(comboRole)的选择应该填充组合框2(comboClass),依此类推。我已经填充了第二个组合框,但是数组中的所有项目都被视为单个项目,因此只能选择数组中的顶级项目。我觉得这与我实施.setModel的方式有关,但我不确定我哪里出错了。

public void actionPerformed(ActionEvent a)
    {
        String selectedRole = (String) comboRole.getSelectedItem();
        if ("Tank".equals(selectedRole)){
            comboClass.removeAllItems(); //cleans out any data currently in comboClass
            comboClass.setModel(new DefaultComboBoxModel(TankClass)); //populating only top level item 
            //entire array is being treated as a single item.
        }
        else if ("Healer".equals(selectedRole)){
            comboClass.removeAllItems();
            comboClass.setModel(new DefaultComboBoxModel(HealerClass));
        } 
        else if ("Caster".equals(selectedRole)){
            comboClass.removeAllItems();
            comboClass.setModel(new DefaultComboBoxModel(CasterClass));
        }
        else if ("Damage".equals(selectedRole)){
            comboClass.removeAllItems();
            comboClass.setModel(new DefaultComboBoxModel(DpsClass));
        }
    }

1 个答案:

答案 0 :(得分:0)

问题是,每当任何组合框被调整时,ActionListener就会运行,在组合框中创建数组的多个实例。解决方法是为每个Combobox使用ItemListener,以便它只在该框中选择了一个项后添加了desiered数组。同样在使用ItemListener时,需要comboClass.removeAllItems来清除数组,以便在进行选择更改时,只需更改模型就会导致前一个数组堆叠在新数组之上。

        ItemListener roleListener = new ItemListener()
    {
        @Override
        public void itemStateChanged(ItemEvent e)                    
           {

               String selectedRole = (String) comboRole.getSelectedItem();


                if (e.getStateChange() == ItemEvent.SELECTED)
                        {
                            if ("Tank".equals(selectedRole))
                            {
                                comboClass.removeAllItems(); // removes previous selection from combobox
                                comboClass.setModel(new DefaultComboBoxModel(TankClass)); //populates comboClass with Selection

                            }
                            else if ("Healer".equals(selectedRole))
                            {
                                comboClass.removeAllItems();
                                comboClass.setModel(new DefaultComboBoxModel(HealerClass));
                            } 
                            else if ("Caster".equals(selectedRole))
                            {                
                                comboClass.removeAllItems();
                                comboClass.setModel(new DefaultComboBoxModel(CasterClass));
                            }
                            else if ("Damage".equals(selectedRole))
                            {                
                                comboClass.removeAllItems();
                                comboClass.setModel(new DefaultComboBoxModel(DpsClass));
                            }


                        }
           }

    };