2011-04-07 51 views
1

在Java中,是否有一種簡單的方法,我一次只能允許在10個複選框中選擇3個進行檢查? 然後將檢入的值存儲到數組中。Java swing複選框

感謝

回答

1

添加監聽到每個複選框。保持複選框的運行列表已選中。

如果選中複選框,則將其添加到列表的末尾。

如果未選中,請將其從列表中刪除。

如果列表大小大於三,則取消選中列表開頭的複選框,然後將其從列表中刪除。

0

不需要手動操作。例如,如果3盒被標記,你可以設置其他框

box[i].setEditable (false); 

所以用戶必須先切換明顯的盒子了。

0

我不相信這裏有任何內置的東西。但是,當大小爲3應該是很簡單保持簡單

Set<JComponent> 
已選中的項目

,並禁止所有非檢查。

0

不幸的是沒有這樣的免費。從技術上講,即使實施它也不會那麼容易。認爲這個想法聽起來很酷,我明天可能會創建這個組件。

無論如何,讓我們想想你會需要什麼。我認爲一個構造函數應該看起來像這樣。

MaxToggleController(列表< JToggleButton中>的ToggleButtons,INT maxToSelect)

使用JToggleButton中,以便用戶可以使用的其他組件則僅複選框。



import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 

/** 
* Controller of toggle button selection. User can specify a maximum 
* allowed number of toggle buttons that can be selected at a particular time. 
* The controller will make sure that up to the defined maximum number 
* of buttons can be selected. 
* @author Konrad Borowiecki 
*/ 
public class MaxToggleController 
{ 
    /** List of toggle buttons to control. */ 
    private List<JToggleButton> toggleButtons; 
    /** The maximum number of toggle buttons that can be selected at once. */ 
    private int maxToSelect; 
    /** The number of toggle buttons that is currently selected. */ 
    private int currentlySelected = 0; 

    public MaxToggleController(List<JToggleButton> toggleButtons, int maxToSelect) 
    { 
     this.toggleButtons = toggleButtons; 
     this.maxToSelect = maxToSelect; 
     //install the action listener on each toggle button 
     for(JToggleButton tB : toggleButtons) 
      tB.addActionListener(toggleButtonAL); 
    } 
    private ActionListener toggleButtonAL = new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      JToggleButton tB = (JToggleButton) e.getSource(); 
      System.out.println("actionPerformed toggleButtonAL; tB.getText()=" + tB.getText() 
        + "; tB.isSelected()=" + tB.isSelected()); 
      //if user deselects it then allow for it 
      if(!tB.isSelected()) 
      { 
       currentlySelected--; 
       tB.setSelected(false);//can be removed 
      } 
      else//user tries to select it 
      { 
       //if max reached do not allow for the tB selection 
       if(currentlySelected == maxToSelect) 
       { 
        //must be deselected as it is already selected 
        tB.setSelected(false); 
       } 
       else 
       { 
        currentlySelected++; 
        tB.setSelected(true);//can be removed 
       } 
      } 
      String textsSeparator = ", "; 
      String toggleButtonTexts = "{"; 
      for(JToggleButton toggleB : getSelectedToggleButtons()) 
       toggleButtonTexts += toggleB.getText() + textsSeparator; 
      int idx = toggleButtonTexts.lastIndexOf(textsSeparator); 
      if(idx != -1) 
       toggleButtonTexts = toggleButtonTexts.substring(0, idx) 
         + toggleButtonTexts.substring(idx + textsSeparator.length(), toggleButtonTexts.length()); 
      toggleButtonTexts += "}"; 
      System.out.println("actionPerformed toggleButtonAL; currentlySelected=" 
        + currentlySelected + "; getSelectedToggleButtons().size()=" + getSelectedToggleButtons().size() 
        + "\n   ; toggleButtonTexts=" + toggleButtonTexts); 
     } 
    }; 

    public List<JToggleButton> getSelectedToggleButtons() 
    { 
     List<JToggleButton> selectedToggleButtons = new ArrayList(); 
     for(JToggleButton tB : toggleButtons) 
      if(tB.isSelected()) 
       selectedToggleButtons.add(tB); 
     return selectedToggleButtons; 
    } 

    public static void main(String[] args) 
    { 
     List<JToggleButton> tBs = new ArrayList<JToggleButton>(); 
     int noOfTBs = 10; 
     JPanel contentPane = new JPanel(); 
     for(int i = 0; i < noOfTBs; i++) 
     { 
      JToggleButton tB = new JToggleButton("Toggle " + i); 
      tBs.add(tB); 
      contentPane.add(tB); 
     } 
     int maxToSelect = 3; 
     MaxToggleController tC = new MaxToggleController(tBs, maxToSelect); 

     JFrame f = new JFrame(); 
     f.setContentPane(contentPane); 
     f.setSize(400, 400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 
} 

我碰巧有一些閒暇時間,所以我實現了我自己的控制器。 還有很多調試代碼,可以讓您觀察運行時發生的情況。不要忘記這並不完美。這是一個快速的草案,這裏有一些明顯的問題,例如setSelected by user用於切換按鈕的編程式調用。

下面是我的控制器的更新版本,它處理JToggleButton選擇設置,即使它是在代碼中完成的。


import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 

/** 
* Controller of toggle button selection. User can specify a maximum 
* allowed number of toggle buttons that can be selected at a particular time. 
* The controller will make sure that up to the defined maximum number 
* of buttons can be selected. 
* @author Konrad Borowiecki 
*/ 
public class MaxToggleController 
{ 
    /** List of toggle buttons to control. */ 
    private List<JToggleButton> toggleButtons; 
    /** The maximum number of toggle buttons that can be selected at once. */ 
    private int maxToSelect; 
    /** The list with the buttons which are currently selected. */ 
    private List<JToggleButton> selectedToggleButtons; 

    public MaxToggleController(List<JToggleButton> toggleButtons, int maxToSelect) 
    { 
     this.toggleButtons = toggleButtons; 
     this.maxToSelect = maxToSelect; 
     this.selectedToggleButtons = new ArrayList<JToggleButton>();   
     //install the action listener on each toggle button 
     for(JToggleButton tB : toggleButtons) 
      tB.addItemListener(itemListener); 
    } 

    private ItemListener itemListener = new ItemListener() 
    { 
     @Override 
     public void itemStateChanged(ItemEvent e) 
     { 
      JToggleButton tB = (JToggleButton) e.getSource(); 
      System.out.println("itemStateChanged; tB.getText()=" + tB.getText() 
        + "; tB.isSelected()=" + tB.isSelected()); 
      //if the tB is inside the selected toggle button list then remove it from there 
      if(isInSelected(tB)) 
      { 
       selectedToggleButtons.remove(tB); 
       //set false only if it is already true 
       if(tB.isSelected()) 
        tB.setSelected(false); 
      } 
      else//otherwise add it if the size is not max 
      { 
       if(selectedToggleButtons.size() == maxToSelect) 
       {    
        //set false only if it is already true 
        if(tB.isSelected()) 
         tB.setSelected(false);//deselect the tB if the list has maximum size 
       } 
       else 
       { 
        selectedToggleButtons.add(tB); 
       } 
      } 
      String textsSeparator = ", "; 
      String toggleButtonTexts = "{"; 
      for(JToggleButton toggleB : getSelectedToggleButtons()) 
       toggleButtonTexts += toggleB.getText() + textsSeparator; 
      int idx = toggleButtonTexts.lastIndexOf(textsSeparator); 
      if(idx != -1) 
       toggleButtonTexts = toggleButtonTexts.substring(0, idx) 
         + toggleButtonTexts.substring(idx + textsSeparator.length(), toggleButtonTexts.length()); 
      toggleButtonTexts += "}"; 
      System.out.println("; selectedToggleButtons.size()=" + selectedToggleButtons.size() 
        + "; toggleButtonTexts=" + toggleButtonTexts); 
     } 

    }; 

    private boolean isInSelected(JToggleButton tB) 
    { 
     return selectedToggleButtons.contains(tB); 
    } 

    public List<JToggleButton> getSelectedToggleButtons() 
    { 
     return selectedToggleButtons; 
    } 

    public static void main(String[] args) 
    { 
     List<JToggleButton> tBs = new ArrayList<JToggleButton>(); 
     int noOfTBs = 10; 
     JPanel contentPane = new JPanel(); 
     for(int i = 0; i < noOfTBs; i++) 
     { 
      JToggleButton tB = new //JCheckBox("Check "+i); 
        JToggleButton("Toggle " + i); 
      tBs.add(tB); 
      contentPane.add(tB); 
     } 
     int maxToSelect = 3; 
     MaxToggleController tC = new MaxToggleController(tBs, maxToSelect); 

     tBs.get(0).setSelected(true); 
     tBs.get(5).setSelected(true);  
     tBs.get(6).setSelected(true); 
     //the Toggle 7 will not be selected 
     tBs.get(7).setSelected(true); 

     JFrame f = new JFrame(); 
     f.setContentPane(contentPane); 
     f.setSize(400, 400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 
} 

享受,博羅。