我有一个带有三个组合框的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));
}
}
答案 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));
}
}
}
};