Java JCombobox更新问题

Java JCombobox更新问题,java,swing,jcombobox,Java,Swing,Jcombobox,我试图根据其他JCombobox(城市)的值更改JCombobox项目列表(城镇)。当我更改城市列表中的值时,它会更改城镇列表中的项目。但有两个问题 更新后的列表(城镇)显示了两个项目,但当单击它时,它会显示正确的项目数量,如第一个屏幕截图所示 更新的列表不允许我选择其中一项,它只选择第一项 这是我的密码: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*

我试图根据其他JCombobox(城市)的值更改JCombobox项目列表(城镇)。当我更改城市列表中的值时,它会更改城镇列表中的项目。但有两个问题

  • 更新后的列表(城镇)显示了两个项目,但当单击它时,它会显示正确的项目数量,如第一个屏幕截图所示
  • 更新的列表不允许我选择其中一项,它只选择第一项
  • 这是我的密码:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;   
    public class Testing extends JFrame implements ActionListener {
        
        public static void main(String[] args )
        {
        new Testing();
        }
        JComboBox cb,cb1,cb2;
        JFrame f; 
        JLabel label1,label2;
        JButton b1;
        JTextField name,ID,birth;
        
        
     Testing(){    
            f=new JFrame("Information Example");  
            label1 = new JLabel("Please input your information below");
            label1.setBounds(10, 20, 260, 30);
          f.add(label1);
            String question[]={"Calculate my Age","When do I drive","When do I vote"};
            String city[]={"Asimah","Ahmadi","Hawalli"};
           
                   
             name= new JTextField("NAME");
            name.setBounds(10,50,264,25);
            f.add(name);
             ID= new JTextField("CIVIL ID");
            ID.setBounds(10,80,264,25);
            f.add(ID);
             birth= new JTextField("DATE OF BIRTH");
            birth.setBounds(10,110,264,25);
            f.add(birth);
            cb=new JComboBox(question);    
            cb.setBounds(50, 150,180,20);    
            f.add(cb);
            b1= new JButton("Get");
            b1.setBounds(100,250,60,20);
            f.add(b1);
            cb1=new JComboBox(city);    
            cb1.setBounds(10, 200,120,20);    
            f.add(cb1);
            cb2=new JComboBox();    
            cb2.setBounds(150, 200,120,20);    
            f.add(cb2);
         
            f.setLayout(null);    
            f.setSize(300,400);    
            f.setVisible(true);
            cb.addActionListener(this);
            cb1.addActionListener(this);
            cb2.addActionListener(this);
    }
     @Override
     public void actionPerformed(ActionEvent event)
     {
         if(cb1.getSelectedIndex() == 0)
         {
             cb2.removeAllItems();
            
             cb2.addItem("Rawdhah");
             cb2.addItem("Abdahll");
         }
         else if(cb1.getSelectedIndex() == 1)
         {
            
             cb2.removeAllItems();
             cb2.addItem("Siddiq");
             cb2.addItem("Aljabryha");
         }
         else
         {
             cb2.removeAllItems();
             cb2.addItem("Fintas");
             cb2.addItem("Abdahll");
         }
         
     }
    }
    

    因此,基本上,
    removeAllItems
    addItem
    的组合会导致
    JComboBox
    生成一个
    ActionEvent
    ,但只针对添加的第一个新项

    您应该隔离您的功能,以便仅根据事件源执行某些操作,例如

    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == cb1) {
            if (cb1.getSelectedIndex() == 0) {
                cb2.removeAllItems();
    
                System.out.println(cb2.getItemCount());
    
                cb2.addItem("Rawdhah");
                cb2.addItem("Abdahll");
            } else if (cb1.getSelectedIndex() == 1) {
    
                cb2.removeAllItems();
                cb2.addItem("Siddiq");
                cb2.addItem("Aljabryha");
            } else {
                cb2.removeAllItems();
                cb2.addItem("Fintas");
                cb2.addItem("Abdahll");
            }
        }
    }
    

    您也可以使用
    actionCommand
    属性,但上面是更简单的即时解决方案

    您的
    ActionListener
    被触发两次,一次用于
    cb1
    ,一次用于
    cb2
    cb2`是触发一个
    ActionEvent
    ,因为
    addItem
    正在更改所选项目,因此,您
    addItem
    s,事件被触发,您添加两个新项目,然后再添加两个项目。它不会进入无限循环,因为您添加的第二个项不会更改所选项-因为第一个项现在已被选中这里有一种更改模型的方法:。它还将支持在不使用嵌套的if/else语句的情况下更改无限多个城市的模型。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。