我想在java中动态创建复选框,这样每当按下一个按钮时,就会创建一个新的复选框并出现,每当按下另一个按钮时,所有选中的复选框都将被删除。任何人都可以帮忙吗?
到目前为止,我只手动创建了复选框
cb1=new JCheckBox("Task 1");
cb2=new JCheckBox("Task 2");
cb3=new JCheckBox("Task 3");
cb4=new JCheckBox("Task 4");
cb5=new JCheckBox("Task 5");
cb6=new JCheckBox("Task 6");
addTask= new JButton("Add Task");
removeTask= new JButton("Remove Checked");
addTask.addActionListener(this);
removeTask.addActionListener(this);
答案 0 :(得分:3)
让我们说代替cb1,cb2,cb3等你创建一个ArrayList
JCheckBox
es并为checkbox
创建一个面板,而不是按钮。现在,每次按添加按钮,您都会创建另一个复选框,并将其添加到面板和ArrayList
。按删除按钮时,清除阵列列表和面板。以下代码只是一个示例代码段,而不是完整的测试代码,但它应该为您提供方向。
// Up in your code
List<JCheckBox> cbarr = new ArrayList<JCheckBox>();
// The listener code
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addTask) // add checkbox
{
JCheckBox cb = new CheckBox("New CheckBox");
cbarr.add(cb);
cbpanel.add(cb);
}
else // remove checkboxs
{
cbarr = new ArrayList<JCheckBox>();
cbpanel.removeAll()
}
}
修改强>
我很抱歉,但是当你说你只想删除复选框时,我错过了这个部分。这可以通过更改else块中的代码轻松完成:
for (int i = cbarr.size() - 1; i >=0; i--)
{
JCheckBox cb = cbarr.get(i);
if (cb.isSelected())
{
cbarr.remove(cb);
cbpanel.remove(cb);
}
}
答案 1 :(得分:2)
而不是为每个复选框创建一个新变量。存储对列表中复选框的引用。创建新复选框时,将它们添加到列表中。如果要将它们全部删除,请从GUI中删除它们并清除列表。
答案 2 :(得分:2)
您应该使用一些布局管理器,例如GridLayout,您可以通过在布局构造函数中将它们设置为0来指定,行或列是动态的。
在actionPerformed方法中,您可以使用JPanel.add()方法将面板添加到面板中,并在完成后验证它。
关于删除,您可以遍历面板组件列表并调用JPanel.remove()方法,然后验证面板。
祝你好运,博罗。答案 3 :(得分:2)
当您动态添加/删除GUI的组件时,您需要告诉布局管理器已进行了更改。你可以使用以下代码执行此操作:
panel.add(....);
panel.revalidate();
panel.repaint();
答案 4 :(得分:2)
//这肯定会帮到你!
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class tester {
JButton remove;
JButton appear;
JCheckBox cb[]=new JCheckBox[10];
tester() {
buildGUI();
hookUpEvents();
}
public void buildGUI() {
JFrame fr=new JFrame();
JPanel p=new JPanel();
remove=new JButton("remove");
appear=new JButton("appear");
for(int i=0;i<10;i++) {
cb[i]=new JCheckBox("checkbox:"+i);
cb[i].setVisible(false);
}
fr.add(p);
p.add(remove);
p.add(appear);
for(int i=0;i<10;i++) {
p.add(cb[i]);
}
fr.setVisible(true);
fr.setSize(400,400);
}
public void hookUpEvents() {
remove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
for(int i=0;i<10;i++) {
cb[i].setVisible(false);
}
}
});
appear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
for(int i=0;i<10;i++) {
cb[i].setVisible(true);
}
}
});
}
public static void main(String args[]) {
new tester();
}
}
答案 5 :(得分:1)
此Nested Layout Example左侧有一个JButton
Add Another Label
。它以两列为单位添加标签。可以应用相同的基本原则来添加任意数量的JCheckBox
。
要删除它们,请调用Container.removeAll()
并在之后调用相同的方法来更新GUI。
答案 6 :(得分:1)
以上所有解决方案均优秀。但另一种方法是,如果列中有一个重要的复选框列表,请考虑使用一个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);
}
}
}
}
答案 7 :(得分:0)
您可以使用包含复选框类型的集合数组,为复选框名称初始化数据集合,初始化复选框和集合数组,最后循环遍历集合数组并根据是否选中复选框对象执行逻辑处理