【发布时间】:2011-04-07 17:07:37
【问题描述】:
在 Java 中,有没有一种简单的方法,我一次只能检查 10 个复选框中的 3 个? 然后将检查的值存储到数组中。
谢谢
【问题讨论】:
在 Java 中,有没有一种简单的方法,我一次只能检查 10 个复选框中的 3 个? 然后将检查的值存储到数组中。
谢谢
【问题讨论】:
为每个复选框添加一个监听器。保持选中复选框的运行列表。
如果选中了一个复选框,请将其添加到列表的末尾。
如果未选中,请将其从列表中删除。
如果列表的大小大于三,请取消选中列表开头的复选框,并将其从列表中删除。
【讨论】:
没有。您必须手动完成。例如,如果标记了 3 个框,则可以将其他框设置为
box[i].setEditable (false);
所以用户必须先关闭标记的框。
【讨论】:
我不相信有任何内置的东西。但保持简单
Set<JComponent>
已选中的项目,并且在大小为 3 时禁用所有未选中的项目应该非常简单。
【讨论】:
遗憾的是,没有这样的免费服务。从技术上讲,即使实现它也不会那么容易。觉得这个想法听起来很酷,我明天可能会创建这个组件。
不管怎样,让我们想想你需要什么。我认为构造函数应该是这样的。
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);
}
}
享受吧,波罗。
【讨论】: