Снимите все флажки, добавленные в группу - PullRequest
1 голос
/ 15 марта 2010

У меня есть 4 флажка, добавленных в группу, чтобы я мог выбрать только один флажок. Но если я выберу один из них и теперь хочу снять все флажки в группе, я не смогу этого сделать. У кого-нибудь есть идеи, как я могу это сделать?

Ответы [ 6 ]

4 голосов
/ 16 марта 2010

Поведение, о котором вы спрашиваете, это наполовину флажок и наполовину радиокнопка, и вот как вы делаете это правильно: сделайте группу из пяти радиокнопок, первая из которых (или последняя) в основном говорит «Ни один из других вариантов».

2 голосов
/ 16 марта 2010

Основываясь на ответе @ trashgod, вот работающий пример кода, где JButton подключается для очистки выбора из группы JRadioButton объектов, используя ButtonGroup.clearSelection():

public class ClearableRadioButtons extends JFrame {

    public ClearableRadioButtons() {
        JPanel content = new JPanel();
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));

        final ButtonGroup group = new ButtonGroup();
        for (int i = 1; i < 10; i++) {
            JRadioButton nextButton = new JRadioButton("Button " + i);
            group.add(nextButton);
            content.add(nextButton);
        }
        content.add(new JButton(new AbstractAction("Clear") {
            public void actionPerformed(ActionEvent arg0) {
                // This is the one line you really care about:
                group.clearSelection();
            } 
        }));

        setLayout(new BorderLayout());
        add(content, BorderLayout.CENTER);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ClearableRadioButtons();
            }
        });
    }
}

Обратите внимание, что этот код будет одинаково хорошо работать, если заменить все экземпляры JRadioButton на JCheckBox. Тем не менее, это не рекомендуется , потому что стандартный способ указать, что можно выбрать только одну вещь, это использовать переключатели, а не флажки. Если пользователь видит флажки, пользователи, как правило, ожидают, что ему будет разрешено выбрать более одного, и они будут раздражены, когда выбор одного из флажков приводит к тому, что другие становятся невыбранными.

Если вам действительно не нравится, как выглядят JRadioButton кнопки, то я предлагаю поиграть с вашим Swing-интерфейсом, чтобы изменить все ваших флажков и переключателей в вашем приложении, пока вы не довольны результатом.

2 голосов
/ 15 марта 2010

Вы можете использовать clearSelection(), который «очищает выбор, так что ни одна из кнопок в ButtonGroup не выбрана».

Кроме того, использование JRadioButton в группе с одним выбором может быть менее запутанным, чем флажки.

Приложение: @Joe Carnahan и @Chris предложили четкие способы сделать выбор «без выбора» явным. Вы также можете взглянуть на главу 10 Руководства по дизайну Java Look and Feel , в которой обсуждается независимый выбор v. Исключительный в связи с переключателями в целом.

0 голосов
/ 30 октября 2011

Это старая дискуссия ... но у меня была точно такая же проблема, и я не хотел обходного пути, как добавление "кнопки очистки выбора". Итак, я написал свою собственную ButtonGroup, которая решает исходный вопрос (кнопка может быть отменена, оставляя группу без выбранной кнопки). Он также добавляет возможность наблюдения java.util.Observer, который будет получать информацию каждый раз, когда изменяется выбранная кнопка.

Вот код:

package net.yapbam.gui.util;

import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.io.Serializable;

import javax.swing.JToggleButton;

/**
 * This class is, like javax.swing.ButtonGroup, used to create a multiple-exclusion scope for
 * a set of buttons. Creating a set of buttons with the same <code>ButtonGroup</code> object means that
 * turning "on" one of those buttons turns off all other buttons in the group.
 * <p>
 * The main difference of this group with the swing one is that you can deselected buttons by clicking on them
 * and have a group without no selected button.<br>
 * Another difference is that this class extends the java.util.Observable class and calls its observers update method
 * when the selected button changes. 
 * </p>
 */
public class ButtonGroup extends Observable implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     *  The buttons list
     */
    private List<JToggleButton> buttons;
    /**
     * The current selection.
     */
    private JToggleButton selected;
    private ItemListener listener;

    /**
     * Constructor.
     */
    public ButtonGroup() {
        this.buttons = new ArrayList<JToggleButton>();
        this.selected = null;
        this.listener = new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                JToggleButton b = (JToggleButton) e.getItem();
                if (e.getStateChange()==ItemEvent.SELECTED) {
                    setSelected(b);
                } else {
                    if (selected==b) setSelected(null);
                }
            }
        };
    }

    /**
     * Adds a button to this group.
     * @param b the button to be added
     * @exception NullPointerException if the button is null
     */
    public void add(JToggleButton b) {
        if (b==null) throw new NullPointerException();
        buttons.add(b);
        b.addItemListener(listener);
        if (b.isSelected()) setSelected(b);
    }

    /**
     * Removes a button from this group.
     * @param b the button to be removed
     * @exception IllegalArgumentException if the button is unknown in this group
     * @exception NullPointerException if the button is null
     */
    public void remove(JToggleButton b) {
        if (b == null) throw new NullPointerException();
        if (this.buttons.remove(b)) {
            b.removeItemListener(this.listener);
            if (this.selected==b) setSelected(null);
        } else {
            throw new IllegalArgumentException();
        }
    }

    /**
     * Clears the selection such that none of the buttons in the
     * <code>ButtonGroup</code> are selected.
     */
    public void clearSelection() {
        if (selected != null) setSelected(null);
    }

    /**
     * Returns the selected button.
     * @return the selected button
     */
    public JToggleButton getSelected() {
        return this.selected;
    }

    /** Changes the selected button.
     * @param b the button to be selected (null deselects all buttons)
     * @exception IllegalArgumentException if the button is not in this group
     */
    public void setSelected(JToggleButton b) {
        if (b==this.selected) return;
        if ((b!=null) && (!this.buttons.contains(b))) throw new IllegalArgumentException();
        JToggleButton old = this.selected;
        this.selected = b;
        if (b!=null) b.setSelected(true);
        if (old!=null) old.setSelected(false);
        this.setChanged();
        this.notifyObservers(this.selected);
    }
}
0 голосов
/ 15 марта 2010

- [EDIT] -
Я сделал ошибку, я ответил на это, думая, что это был проект C # .NET другого вопроса, который я читал. Проголосуйте, чтобы закрыть его, если хотите, но прочитайте эту заметку, прежде чем выбрать понижение.
- [/ EDIT] -

Для того, что вы сказали потом, вы включаете радиобоксы, которые могут выступать в качестве флажков (повторный щелчок по тому же самому должен снять флажок). Для этого вы можете использовать radiobuttons и добавить опцию с именем «none», которая будет действовать так, как если бы не было выбрано ни одной опции, или поместить «чистую» кнопку, которая отменяет выбор каждой радиопереключателя.

Или, если вы ДЕЙСТВИТЕЛЬНО хотите это сделать, вы можете использовать обработчик CheckBox_CheckedChanged, который срабатывает каждый раз, когда флажок отмечен ИЛИ не отмечен, поэтому вам нужно будет проверить, установлен ли флажок внутри обработчика. Код внутри обработчика должен выглядеть следующим образом:

If (CheckBox1.Checked)
{
    CheckBox2.Checked = False;
    CheckBox3.Checked = False;
    CheckBox4.Checked = False;
    CheckBox5.Checked = False;
}
// same for other checkboxes

Или создайте функцию, которая берет установленный флажок и снимает флажки с других, и помещает его в каждый обработчик, каждый из которых отправляет желаемый флажок.

Но я очень советую вам выбрать одно из первых решений, которые я дал ..

0 голосов
/ 15 марта 2010

Вы описываете поведение RadioButton, которое является группой выбора, которая позволяет выбирать только одну опцию в данный момент времени; поддержка для этого встроена в Swing.


РЕДАКТИРОВАТЬ: я неправильно понял вопрос.

Чтобы снять все флажки, вы можете перебрать дочерние элементы Container или, проще, использовать ButtonGroup.getElements() для перечисления кнопок в определенной группе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...