我们在删除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();
}
}
});
}
}