java中的动态复选框

时间:2011-04-22 13:43:55

标签: java swing

我想在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);

8 个答案:

答案 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)

您可以使用包含复选框类型的集合数组,为复选框名称初始化数据集合,初始化复选框和集合数组,最后循环遍历集合数组并根据是否选中复选框对象执行逻辑处理