|
|
|||||||
|
Currently, neither ButtonGroup or JButtonGroup allows you to unselect all buttons. I have modified Daniel's code to provide this functionality. Here's the new class: public class JButtonGroup extends ButtonGroup { /** * Used to deselect all buttons in the group */ private static final AbstractButton dummyButton = new JButton(); /** * Stores a reference to the currently selected button in the group */ private AbstractButton selectedButton; /** * Creates an empty <code>JButtonGroup</code> */ public JButtonGroup() { super(); add(dummyButton); } /** * Creates a <code>JButtonGroup</code> object from an array of buttons and adds the buttons to the group * No button will be selected initially. * @param buttons an array of <code>AbstractButton</code>s */ public JButtonGroup(AbstractButton[] buttons) { add(buttons); add(dummyButton); } /** * Adds a button to the group * @param button an <code>AbstractButton</code> reference */ public void add(AbstractButton button) { if (button == null || buttons.contains(button)) { return; } super.add(button); if (getSelection() == button.getModel()) { selectedButton = button; } } /** * Adds an array of buttons to the group * @param buttons an array of <code>AbstractButton</code>s */ public void add(AbstractButton[] buttons) { if (buttons == null) { return; } for (int i=0; i<buttons.length; i++) { add(buttons); } } /** * Removes a button from the group * @param button the button to be removed */ public void remove(AbstractButton button) { if (button != null) { if (selectedButton == button) { selectedButton = null; } super.remove(button); } } /** * Removes all the buttons in the array from the group * @param buttons an array of <code>AbstractButton</code>s */ public void remove(AbstractButton[] buttons) { if (buttons == null) { return; } for (int i=0; i<buttons.length; i++) { remove(buttons); } } /** * Sets the selected button in the group * Only one button in the group can be selected * @param button an <code>AbstractButton</code> reference * @param selected an <code>boolean</code> representing the selection state of the button */ public void setSelected(AbstractButton button, boolean selected) { if (button != null && buttons.contains(button)) { setSelected(button.getModel(), selected); if (getSelection() == button.getModel()) { selectedButton = button; } } } /** * Sets the selected button model in the group * @param model a <code>ButtonModel</code> reference * @param selected an <code>boolean</code> representing the selection state of the button */ public void setSelected(ButtonModel model, boolean selected) { AbstractButton button = getButton(model); if (buttons.contains(button)) { super.setSelected(model, selected); if(model != dummyButton.getModel()) { selectedButton = button; } } } /** * Returns the <code>AbstractButton</code> whose <code>ButtonModel</code> is given. * If the model does not belong to a button in the group, returns null. * @param model a <code>ButtonModel</code> that should belong to a button in the group * @return an <code>AbstractButton</code> reference whose model is <code>model</code> if the button belongs to the group, <code>null</code>otherwise */ public AbstractButton getButton(ButtonModel model) { for(Iterator i = buttons.iterator(); i.hasNext(); ) { AbstractButton ab = (AbstractButton)i.next(); if (ab.getModel() == model) { return ab; } } return null; } /** * Returns the selected button in the group. * @return a reference to the currently selected button in the group or <code>null</code> if no button is selected */ public AbstractButton getSelected() { if(selectedButton == dummyButton) { return null; } else { return selectedButton; } } public ButtonModel getSelection() { if(selectedButton == dummyButton) { return null; } else { return super.getSelection(); } } /** * Returns whether the button is selected * @param button an <code>AbstractButton</code> reference * @return <code>true</code> if the button is selected, <code>false</code> otherwise */ public boolean isSelected(AbstractButton button) { if(button == dummyButton) { return false; } return button == selectedButton; } /** * Returns the buttons in the group as a <code>List</code> * @return a <code>List</code> containing the buttons in the group, in the order they were added to the group */ public List getButtons() { List allButtons = new LinkedList(buttons); allButtons.remove(dummyButton); return Collections.unmodifiableList(allButtons); } /** * Checks whether the group contains the given button * @return <code>true</code> if the button is contained in the group, <code>false</code> otherwise */ public boolean contains(AbstractButton button) { if(button == dummyButton) { return false; } return buttons.contains(button); } /** * unselects all buttons */ public void unselectAll() { setSelected(dummyButton, true); } } |