2011-04-22 76 views
1

我想在java中动态地创建复选框,以便无论何时按下按钮,都会创建并显示一个新的复选框,并且每当按下另一个按钮时,所有复选框都将被删除。任何人都可以帮忙吗?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); 
+1

你能告诉我们你有什么? – MByD 2011-04-22 13:45:19

+0

我不知道我将如何使用添加任务按钮上创建的复选框按特别是不知道每个复选框的边界 – 2011-04-22 13:52:54

+0

请不要在评论中张贴代码。使用代码示例更新您的问题。 – Juliet 2011-04-22 17:58:50

回答

3

比方说,与其CB1,CB2,CB3等创建JCheckBoxArrayList ES只为checkbox S创建面板,而不是为按钮。现在,每次按添加按钮时,都会创建另一个复选框,并将其添加到面板和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); 
    } 
} 
+0

+1好代码。非常适合一般解决方案。我知道我很挑剔,但:)...可能使用removeAll并不总是如此。但是如果你认为在你调用这个方法的面板中你只有你的复选框,那么你很好。 – Boro 2011-04-22 14:38:51

+0

谢谢,我想我提到这个解决方案需要他创建一个单独的面板。有时它不适合,但我认为那些时间是非常罕见的。 – MByD 2011-04-22 14:44:00

+0

你是对的。我只是想强调这个问题。 – Boro 2011-04-22 15:49:34

2

而不是为每个复选框创建一个新变量。将参考复选框存储在列表中。当你创建新的复选框时,将它们添加到列表中。如果您想要全部删除它们,请从GUI中删除它们并清除列表。

+0

很多感谢您的答案,但我只想删除选定的框,所以我'd检查之前删除它们,所以我如何检查列表中的每个框?另外我怎样才能指定盒子的位置,以便每当一个盒子被移除时,它下面的盒子将取代它的位置?在此先感谢 – 2011-04-22 14:15:54

+0

@Fatema Mohsen,这实际上是非常好的建议,它将允许您始终将自己的手放在您的复选框上,而与您的面板中可能包含的其他组件无关。我就是你。当然,你仍然需要从面板上移除它们。但是你直接迭代列表。 +1到@jzd为此。 – Boro 2011-04-22 14:35:16

2

您应该使用一些布局管理器,例如GridLayout,您可以指定它们,通过在布局构造器中将行或列设置为0来将其设置为动态。

在actionPerformed方法中,您将使用JPanel.add()方法添加到面板的新复选框,并在完成后对其进行验证。

关于删除,您可以遍历面板组件列表并调用JPanel.remove()方法,然后验证面板。

祝你好运,博罗。

+0

非常感谢您的回答,我会尝试它,请让我告诉你我有什么:) – 2011-04-22 14:20:57

+0

@Fatema Mohsen是很酷。请保持我(和我们)通知。 – Boro 2011-04-22 14:28:27

1

Nested Layout Example有一个JButton在左边到Add Another Label。它在两列中添加标签。相同的基本原则可以适用于添加任何数量的JCheckBox

要删除它们,请调用Container.removeAll(),然后调用相同的方法更新GUI。

+0

非常感谢你的榜样,我会尝试一下,请让我通知你。 – 2011-04-22 14:33:34

2

当您为GUI动态添加/删除组件时,您需要告诉布局管理器已做出更改。这样做有如下代码:

panel.add(....); 
panel.revalidate(); 
panel.repaint(); 
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); 
     } 
     } 

    } 
} 
+0

+1非常有趣的方法。 – Boro 2011-04-22 16:02:20

+0

@Boro:谢谢! :) – 2011-04-22 16:22:45

+0

如果我只能+1更多的时间,我会为例。在我的NetBeans的StackOverflow项目中存储。谢谢:) – Boro 2011-04-22 17:49:13

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(); 
     } 
     } 
+0

我同意这可能有帮助。尽管你可以使它更好一些,例如突出显示代码中数字10的含义(可选数量的复选框)。加上其他与数组结构限制有关的问题,其中@Fatema Mohsen在动态解决方案之后。无论如何,它作为一个起点是有用的。 – Boro 2011-04-22 15:59:01