以上所有的解决方案都优秀。另一种方法是,如果在列中有一个重要的复选框列表,请考虑使用具有复选框列或可能是列的“JTable”作为“标签”。 Oracle Swing JTable tutorial将告诉你如何做到这一点,但它只是扩展一个DefaultTableModel类,并重写它的getColumnClass方法来返回具有复选框的列的Boolean.class。然后用布尔对象填充模型。然后,您可以添加或删除模型中的行,并让JTable负责处理GUI的实质。如果您想以这种方式尝试,我们可以帮助您解决具体问题。
编辑1:
例如:
编辑2:
添加/删除功能显示
编辑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);
}
}
}
}
你能告诉我们你有什么? – MByD 2011-04-22 13:45:19
我不知道我将如何使用添加任务按钮上创建的复选框按特别是不知道每个复选框的边界 – 2011-04-22 13:52:54
请不要在评论中张贴代码。使用代码示例更新您的问题。 – Juliet 2011-04-22 17:58:50