How to dynamically add/remove JComboBox Items

本文介绍了一种在Java Swing中动态添加和移除JComboBox控件项的方法,避免了直接使用removeAllItems方法可能引发的异常。通过示例代码展示了如何在移除所有项前解除事件监听器,以及在重新添加项后重新注册监听器的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在删除JComboBox控件中addItem方法添加的每一项内容时,

不可以简单的直接调用removeAllItems方法,这样会抛出异常;

正确的范例代码如下:

package com.myth;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

/**
 *
 * @author zhengzizhi@126.com
 */
public class JComboBoxMemo extends JFrame {

    private JPanel contentPane;
    private JComboBox<Integer> cmbColumn;
    private JButton btnInitJComboBox;
    private JTextArea txaInfoOutput;
    Integer[] int1Arr = new Integer[]{1, 2, 3, 4};
    Integer[] int2Arr = new Integer[]{1, 2, 3, 4, 5, 6, 7};
    Integer[] int3Arr = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

    public JComboBoxMemo() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setBounds(0, 0, 800, 600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        setTitle("How to dynamically add/remove JComboBox Items ");
        contentPane.setLayout(null);

        cmbColumn = new JComboBox();
        cmbColumn.setBounds(75, 50, 75, 23);
        contentPane.add(cmbColumn);

        btnInitJComboBox = new JButton("Random Init JComboBox");
        btnInitJComboBox.setBounds(160, 50, 250, 23);
        contentPane.add(btnInitJComboBox);

        JPanel outputPane = new JPanel();
        outputPane.setBorder(new TitledBorder(null, "  打印输出信息:  ", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(59, 59, 59)));
        outputPane.setBounds(20, 90, 750, 242);//前两个参数是横纵坐标,后两个参数是宽度和高度
        contentPane.add(outputPane);
        outputPane.setLayout(new BorderLayout(0, 5));//布局管理器

        JScrollPane textArea1ScrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        outputPane.add(textArea1ScrollPane);

        txaInfoOutput = new JTextArea();
        textArea1ScrollPane.setViewportView(txaInfoOutput);

        cmbColumn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Integer selectedItem = Integer.parseInt(cmbColumn.getSelectedItem().toString());
                txaInfoOutput.append("You have already selected the item " + selectedItem + "\r\n");
            }
        });

        btnInitJComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Random num = new Random();
                int number = num.nextInt(3) + 1; //  1 ≤ number ≤ 3
                Integer[] initArr;
                switch (number) {
                    case 1:
                        initArr = Arrays.copyOfRange(int1Arr, 0, int1Arr.length);
                        break;
                    case 2:
                        initArr = Arrays.copyOfRange(int2Arr, 0, int2Arr.length);
                        break;
                    default:
                        initArr = Arrays.copyOfRange(int3Arr, 0, int3Arr.length);

                }

                ActionListener[] aListeners = cmbColumn.getActionListeners();
                /**删除下拉列表之前,先删除它们的行为监听.**/
                for (int i = 0; i < aListeners.length; i++) {
                    cmbColumn.removeActionListener(aListeners[i]);
                }
                cmbColumn.removeAllItems();
                for (int i = 0; i < initArr.length; i++) {
                    cmbColumn.addItem(initArr[i]);
                }
                 /**
                    addItem方法添加的每一项内容都不具备事件监听功能,
                    所以添加完每项内容之后必须添加它们的行为监听.
                **/
                for (int i = 0; i < aListeners.length; i++) {
                    cmbColumn.addActionListener(aListeners[i]);
                }

            }
        });

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JComboBoxMemo frame = new JComboBoxMemo();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值