更改另一个JComboBox后填充JComboBox

时间:2017-06-03 22:56:45

标签: java arraylist jcombobox treemap

我有一个班级

    public class Speciality {
    String specName;
    String eduProgram; }

和TreeMap Map<String, ArrayList<Speciality>> treeMap = new TreeMap<String, ArrayList<Speciality>>();,其中String是教师的名称。

我的第一个JComboBox包含各个学院的名字(因此它们等于我的地图中的键),在我的BoxActionListener中,我需要用specNames数组填充我的第二个JComboBox。

在这里你可以看到我真正需要的东西,但是它没有字(因为我把String []转换为String)

boxSpeciality.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for(int i = 0; i < treeMap.size(); i++){
                    Object key = treeMap.keySet().toArray(new Object[treeMap.size()])[i];
                    ArrayList<Speciality> value = treeMap.get(key);


                    if(key == boxFaculty.getSelectedItem()){
                        boxSpeciality.setModel(new DefaultComboBoxModel((String[]) value.get(i).specName));
                    }
                }
            }
        });

1 个答案:

答案 0 :(得分:1)

据我了解,你的组合框boxFaculty显示了treeMap的教师姓名密钥,你的组合框boxSpeciality应该显示每个教师的专业(这是其中一个值) treeMap)。

如果您希望根据boxSpeciality的选择填充boxFaculty,则应在actionListener上写一个boxFaculty

另一件需要注意的事情是,不要每次在动作侦听器中设置新的DefaultComboboxModel。在定义组合框并在动作侦听器中更新其元素时设置一个。

您可以执行以下操作:

DefaultComboBoxModel<Speciality> specialityModel = new DefaultComboBoxModel<Speciality>();
boxSpeciality.setModel( specialityModel );
boxFaculty.addActionListener( new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object obj = boxFaculty.getSelectedItem();
        if ( obj != null )
        { 
           ArrayList<Speciality> specialities = treeMap.get( obj );
           specialityModel.removeAllElements();
           for ( Speciality speciality : specialities )
           {
              specialityModel.addElement( speciality );
           }
        }

    }

});

每当您选择boxSpeciality中的项目时,这将更新boxFaculty框。