All the above solutions are excellent. One alternative though is if you have a significant list of check boxes in a column, Consider instead using a JTable that has a column of check boxes and perhaps a column as a "label". The Oracle Swing JTable tutorial will show you how to do this, but it's simply a matter of extending a DefaultTableModel class and overriding it's getColumnClass method to return Boolean.class for the column with the checkboxes. Then fill the model with Boolean objects. You can then add or remove rows from the model and have the JTable take care of handling the GUI nitty gritty. If you want to try it this way, we can help you with the specifics.
edit 1:
For Example:
edit 2:
add/remove functionality shown
edit 3:
Moved the removeChecked and showAll methods into the model class.
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public class CheckBoxTable extends JPanel {
public static final String[] COLUMNS = {"Purchased", "Item"};
public static final String[] INITIAL_ITEMS = {"Milk", "Flour", "Rice", "Cooking Oil", "Vinegar"};
private CheckBoxDefaultTableModel model = new CheckBoxDefaultTableModel(COLUMNS, 0);
private JTable table = new JTable(model);
private JTextField itemTextField = new JTextField("item", 10);
public CheckBoxTable() {
JButton addItemBtn = new JButton("Add Item");
addItemBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addItemActionPerformed();
}
});
JButton removeCheckedItemsBtn = new JButton("Remove Checked Items");
removeCheckedItemsBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeCheckedItemsActionPerformed();
}
});
JButton showAllBtn = new JButton("Show All");
showAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showAllActionPerformed();
}
});
itemTextField.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
itemTextField.selectAll();
}
});
JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
btnPanel.add(itemTextField);
btnPanel.add(addItemBtn);
btnPanel.add(removeCheckedItemsBtn);
btnPanel.add(showAllBtn);
setLayout(new BorderLayout(5, 5));
add(new JScrollPane(table), BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
for (int i = 0; i < INITIAL_ITEMS.length; i++) {
Object[] row = {Boolean.FALSE, INITIAL_ITEMS[i]};
model.addRow(row);
}
}
private void showAllActionPerformed() {
model.showAll();
}
private void removeCheckedItemsActionPerformed() {
model.removeCheckedItems();
}
private void addItemActionPerformed() {
String item = itemTextField.getText().trim();
if (!item.isEmpty()) {
Object[] row = {Boolean.FALSE, item};
model.addRow(row);
}
}
private static void createAndShowUI() {
JFrame frame = new JFrame("CheckBoxTable");
frame.getContentPane().add(new CheckBoxTable());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
@SuppressWarnings("serial")
class CheckBoxDefaultTableModel extends DefaultTableModel {
private List<String> removedItemsList = new ArrayList<String>();
public CheckBoxDefaultTableModel(Object[] columnNames, int rowCount) {
super(columnNames, rowCount);
}
public void showAll() {
if (removedItemsList.size() > 0) {
Iterator<String> iterator = removedItemsList.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
Object[] row = {Boolean.TRUE, next};
addRow(row);
iterator.remove();
}
}
}
@Override
public Class<?> getColumnClass(int columnNumber) {
if (columnNumber == 0) {
return Boolean.class;
}
return super.getColumnClass(columnNumber);
}
public void removeCheckedItems() {
int rowCount = getRowCount();
for (int row = rowCount - 1; row >= 0; row--) {
if ((Boolean) getValueAt(row, 0)) {
removedItemsList.add(getValueAt(row, 1).toString());
removeRow(row);
}
}
}
}