在Java中,是否有一种简单的方法可以让我一次只能选中10个复选框中的3个?然后将检查的值存储到数组中。
谢谢
为每个复选框添加一个侦听器。保持一个复选框被选中的运行列表。
如果复选框被选中,则将其添加到列表末尾。
如果未选中,则将其从列表中删除。
如果列表的大小大于3,取消列表开头的复选框,并将其从列表中删除。
No。你必须手动操作。例如,如果标记了3个框,则可以将其他框设置为
box[i].setEditable (false);
所以用户必须先关闭一个标记框
我不相信有任何内置的东西。但是保持一个简单的
Set<JComponent>
遗憾的是没有免费的。从技术上讲,即使实现它也不会那么容易。我觉得这个想法听起来很酷,我明天可能会创建这个组件。
不管怎样,让我们想想你需要什么。我认为构造函数应该是这样的。
MaxToggleController(List
使用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);
}
}
享受,米堡。