0

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

1 回答 1

0

问题在于,每次分割任何组合框时都会运行一个 ActionListener,从而在组合框中创建多个数组实例。解决方案是为每个 Combobox 使用 ItemListener,以便它仅在该框选择了一个项目后添加所需的数组。同样,当使用 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));
                            }


                        }
           }

    };
于 2012-07-15T16:27:29.320 回答