2011-04-22 28 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