如何将值加载到JComboBox中,具体取决于另一个JComboBox的选择?

时间:2016-08-29 16:09:32

标签: java ms-access dependencies jcombobox

这是我的代码:

JComboBox unity=new JComboBox();
unity.setBounds(430,280,140,25);
unity.addItem("Pakistan");
unity.addItem("China");
unity.addItem("America");
unity.addItem("Japan");
unity.addItem("Bangladesh");
unity.addItem("Srilanka");
unity.addItem("India");
unity.addItem("Turkey");
unity.addItem("UK");
unity.addItem("Afghanistan");
unity.addItem("Iran");
unity.addItem("Iraq");
unity.setEditable(true);
uy.add(unity);

JLabel city=new JLabel("City:");
city.setBounds(350,320,100,25);
city.setForeground(Color.BLACK);
uy.add(city);
JComboBox cety=new JComboBox();
cety.setBounds(430,320,140,25);

cety.addItem("");
uy.add(cety);
unity.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent olala){
    if(unity.getSelectedItem().equals("Pakistan")){
        cety.addItem("Lahore");
        cety.addItem("Islamabad");
        cety.addItem("Karachi");
        cety.addItem("Rawalpindi");
        cety.addItem("Faisalabad");
        cety.addItem("Gujjranwala");
    }
}
});

但是当我运行程序时,if语句的块没有做任何事情。 如果我想根据另一个JComboBox的选择将值加载到JComboBox,我该怎么办?

1 个答案:

答案 0 :(得分:0)

实际上,如果您首先选择“中国”,然后再选择“巴基斯坦”,并点击cety组合框的向下箭头,您将看到这些项目。

您可以通过添加println之类的方式轻松调试并查看方法的调用,

        ...
        unity.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent olala) {
// DEBUG
System.out.println("itemStateChanged(): item = " + olala.getItem());
            ...

当您选择其他项目时,您会注意到itemStateChanged 调用。如果你第一次启动程序并看到组合框,它们还没有改变状态,该方法尚未调用,cety为空。您可以通过添加

使unity更改状态
        unity.setSelectedIndex(1);
        unity.setSelectedIndex(0);

代码末尾。或者,您可以将所有unity.addItem行移至addItemListener之后,因此将第一项添加到列表将触发事件。

您需要在添加新项目之前清除这些项目,或者在unity中选择一些项目会在cety中生成长列表。如果列表中需要空字符串,则还需要在此处移动该语句,

            ...
        public void itemStateChanged(ItemEvent olala){
            cety.removeAllItems();
            cety.addItem("");
            if (unity.getSelectedItem().equals("Pakistan")) {
                cety.addItem("Lahore");
                ...

然后,您可以使用switch代替大量if语句,从事件而不是unity获取项目,并删除原始类型:

    JComboBox<String> unity = new JComboBox<>();
    unity.setBounds(430, 280, 140, 25);
    unity.setEditable(true);
    uy.add(unity);

    JLabel city = new JLabel("City:");
    city.setBounds(350, 320, 100, 25);
    city.setForeground(Color.BLACK);
    uy.add(city);

    JComboBox<String> cety = new JComboBox<>();
    cety.setBounds(430, 320, 140, 25);
    uy.add(cety);

    unity.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent event) {
            cety.removeAllItems();
            cety.addItem("");
            switch (event.getItem().toString()) {
                case "Pakistan":
                    cety.addItem("Lahore");
                    cety.addItem("Islamabad");
                    cety.addItem("Karachi");
                    cety.addItem("Rawalpindi");
                    cety.addItem("Faisalabad");
                    cety.addItem("Gujjranwala");
                    break;
                case "China":
                    cety.addItem("Beijing");
                    break;
            //  ...
            }
        }
    });
    unity.addItem("Pakistan");
    unity.addItem("China");
    unity.addItem("America");
    unity.addItem("Japan");
    unity.addItem("Bangladesh");
    unity.addItem("Srilanka");
    unity.addItem("India");
    unity.addItem("Turkey");
    unity.addItem("UK");
    unity.addItem("Afghanistan");
    unity.addItem("Iran");
    unity.addItem("Iraq");

// This would be a workaround if you don't want to move the addItems:
//  unity.setSelectedIndex(1);
//  unity.setSelectedIndex(0);