Все вышеперечисленные решения отлично .Одна альтернатива, хотя, если у вас есть значительный список флажков в столбце, рассмотрите вместо этого использование JTable, который имеет столбец флажков и, возможно, столбец в качестве «метки». Oracle Swing JTable покажет вам, как это сделать, но это просто вопрос расширения класса DefaultTableModel и переопределения его метода getColumnClass для возврата Boolean.class для столбца с флажками.Затем заполните модель булевыми объектами.Затем вы можете добавить или удалить строки из модели, и JTable позаботится о том, чтобы обрабатывать графические элементы графического интерфейса.Если вы хотите попробовать это таким образом, мы можем помочь вам со спецификой.
изменить 1:
Например:
изменить 2:
добавить / удалить показанные функции
edit 3:
Перемещены методы removeChecked и showAll в класс модели.
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);
}
}
}
}