Java swing checkboxes



在Java中,是否有一种简单的方法可以让我一次只能选中10个复选框中的3个?然后将检查的值存储到数组中。

谢谢

为每个复选框添加一个侦听器。保持一个复选框被选中的运行列表。

如果复选框被选中,则将其添加到列表末尾。

如果未选中,则将其从列表中删除。

如果列表的大小大于3,取消列表开头的复选框,并将其从列表中删除。

No。你必须手动操作。例如,如果标记了3个框,则可以将其他框设置为

 box[i].setEditable (false);

所以用户必须先关闭一个标记框

我不相信有任何内置的东西。但是保持一个简单的

 Set<JComponent> 
当size为3时禁用所有未选中项应该是非常简单的。

遗憾的是没有免费的。从技术上讲,即使实现它也不会那么容易。我觉得这个想法听起来很酷,我明天可能会创建这个组件。

不管怎样,让我们想想你需要什么。我认为构造函数应该是这样的。

MaxToggleController(List 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切换按钮。

下面是我的控制器的更新版本,它处理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);
    }
}

享受,米堡。

最新更新