【问题标题】:Java swing checkboxesJava 摆动复选框
【发布时间】:2011-04-07 17:07:37
【问题描述】:

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

谢谢

【问题讨论】:

    标签: java swing checkbox


    【解决方案1】:

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

    如果选中了一个复选框,请将其添加到列表的末尾。

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

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

    【讨论】:

      【解决方案2】:

      没有。您必须手动完成。例如,如果标记了 3 个框,则可以将其他框设置为

       box[i].setEditable (false);
      

      所以用户必须先关闭标记的框。

      【讨论】:

        【解决方案3】:

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

         Set<JComponent> 
        

        已选中的项目,并且在大小为 3 时禁用所有未选中的项目应该非常简单。

        【讨论】:

          【解决方案4】:

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

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

          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);
              }
          }
          

          享受吧,波罗。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-27
            • 1970-01-01
            • 2017-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多