JComboBox实现联动效果

来源:互联网 发布:安卓今日头条源码 编辑:程序博客网 时间:2024/05/13 06:10
package test.awt.jcombobox;import java.awt.BorderLayout;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.util.HashMap;import java.util.Map;import java.util.Vector;import javax.swing.DefaultComboBoxModel;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;public class MainFrame extends JFrame implements ItemListener {    /**     *      */    private static final long serialVersionUID = 1L;    private JComboBox college;    private JComboBox major;    private Map<Integer, Vector<String>> map = new HashMap<Integer, Vector<String>>();        public MainFrame() {        Vector<String> collegeItems = new Vector<String>();        collegeItems.add("物信学院");        collegeItems.add("数统学院");        collegeItems.add("文史学院");        college = new JComboBox(collegeItems);        college.addItemListener(this);                //物信学院的专业        Vector<String> vector0 = new Vector<String>();        vector0.add("物理");        vector0.add("计算机");        vector0.add("电信");        map.put(0, vector0);                //数统学院的专业        Vector<String> vector1 = new Vector<String>();        vector1.add("应用数学");        vector1.add("统计学");        vector1.add("理论数学");        map.put(1, vector1);                //文史学院的专业        Vector<String> vector2 = new Vector<String>();        vector2.add("汉语言文学");        vector2.add("历史");        vector2.add("戏剧文学");        map.put(2, vector2);                        major = new JComboBox(new DefaultComboBoxModel(map.get(0)));        major.addItemListener(this);        JPanel panel = new JPanel();        panel.add(college);        panel.add(major);                this.add(panel, BorderLayout.NORTH);                this.setTitle("JComboBox示例");        this.setSize(800,600);        this.setVisible(true);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    }        public void itemStateChanged(ItemEvent e) {        //在JComboBox的监听事件时总是执行两次,原因如下:        //ItemListener类中的方法itemStateChanged()事件的itemState有关,itemState在这里的状态有两个,Selected 和 deSelected(即选中和未被选中)        //所以,当改变下拉列表中被选中的项的时候,其实是触发了两次事件:        //第一次是上次被选中的项的 State 由 Selected 变为 deSelected ,即取消选择        //第二次是本次被选中的项的 State 由 deSelected 变为 Selected ,即新选中,所以,必然的 ItemStateChanged 事件中的代码要被执行两次了。        //加上最外面的if语句,就可以解决这个问题。        if(e.getStateChange() == ItemEvent.SELECTED) {            if(e.getSource() == college) {                int index = college.getSelectedIndex();                major.setModel(new DefaultComboBoxModel(map.get(index)));            } else if(e.getSource() == major) {                JOptionPane.showMessageDialog(this, "你选择的是:" + college.getSelectedItem() + "的" + major.getSelectedItem() + "专业!");            }        }            }        public static void main(String[] args) {        new MainFrame();    }}

原创粉丝点击