К сожалению, нет ничего такого бесплатно.Технически даже реализовать это было бы не так просто.Хотя мысль звучит круто, я могу создать этот компонент завтра.
В любом случае, давайте подумаем, что вам нужно.Я думаю, что конструктор должен выглядеть примерно так.
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);
}
}
Наслаждайся, Боро.