我有一个使用JCheckbox的小程序。我必须确保用户最多选择5个中的3个。是否有使用计数器的正确方法?
JCheckBoxes填充在for循环中。其中只声明了一个JCheckbox,但为它们分配了不同的值,并将其添加到同一for循环内的JFrame中。
由于从数据库中检索数据,因此使用了循环。
答案 0 :(得分:3)
假设您的jcheckbox位于JPanel
您可以使用此功能获取所选JCheckBox
public int getSelectedNumber(JPanel panel) {
int numberOfSelected = 0;
for (Component c : panel.getComponents()) {
if (c instanceof JCheckBox) {
numberOfSelected += ((JCheckBox) c).isSelected() ? 1 : 0;
}
}
return numberOfSelected;
}
答案 1 :(得分:1)
我必须确保用户最多选择3个中的3个。是否有使用计数器的正确方法?
您不想使用计数器。这只是告诉你选择了多少,并且不会阻止你选择太多。
在允许选中复选框之前,您应该检查已经选择了多少个。
例如:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class CheckBoxGroup
{
private Set<GroupButtonModel> models = new HashSet<GroupButtonModel>();
private int groupSize;
public CheckBoxGroup(int groupSize)
{
this.groupSize = groupSize;
}
public void register(JCheckBox checkBox)
{
ButtonModel groupModel = new GroupButtonModel();
groupModel.setSelected ( checkBox.getModel().isSelected() );
checkBox.setModel( groupModel );
}
private class GroupButtonModel extends JToggleButton.ToggleButtonModel
{
@Override
public void setSelected(boolean selected)
{
if (!selected)
{
models.remove( this );
super.setSelected( selected );
return;
}
// Check number of currently selected check boxes
if (models.size() == groupSize)
{
System.out.println("Only " + groupSize + " items can be selected");
}
else
{
models.add( this );
super.setSelected( selected );
}
}
}
private static void createAndShowGUI()
{
JPanel panel = new JPanel();
CheckBoxGroup group = new CheckBoxGroup(3);
for (int i = 0; i < 10; i++)
{
JCheckBox checkBox = new JCheckBox( String.valueOf(i) );
panel.add( checkBox );
group.register( checkBox );
}
JFrame frame = new JFrame("Check Box Group");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( panel );
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}