web-dev-qa-db-fra.com

Désélection des boutons radio dans Java Swing

Lors de l'affichage d'un groupe de JRadioButtons, initialement aucun d'entre eux n'est sélectionné (sauf si vous l'imposez par programme). Je voudrais pouvoir remettre les boutons dans cet état même après que l'utilisateur en a déjà sélectionné un, c'est-à-dire qu'aucun des boutons ne doit être sélectionné.

Cependant, l'utilisation des suspects habituels ne produit pas l'effet requis: appeler 'setSelected (false)' sur chaque bouton ne fonctionne pas. Fait intéressant, cela fonctionne fonctionne lorsque les boutons ne sont pas placés dans un ButtonGroup - malheureusement, ce dernier est nécessaire pour que JRadioButtons s'excluent mutuellement.

De plus, l'utilisation de la méthode setSelected (ButtonModel, boolean) de javax.swing.ButtonGroup ne fait pas ce que je veux.

J'ai mis en place un petit programme pour démontrer l'effet: deux boutons radio et un JButton. Cliquer sur le JButton devrait désélectionner les boutons radio afin que la fenêtre ressemble exactement à ce qu'elle fait lorsqu'elle apparaît pour la première fois.

import Java.awt.Container;
import Java.awt.GridLayout;
import Java.awt.event.*;
import javax.swing.*;

/**
 * This class creates two radio buttons and a JButton. Initially, none
 * of the radio buttons is selected. Clicking on the JButton should
 * always return the radio buttons into that initial state, i.e.,
 * should disable both radio buttons.
 */
public class RadioTest implements ActionListener {
    /* create two radio buttons and a group */
    private JRadioButton button1 = new JRadioButton("button1");
    private JRadioButton button2 = new JRadioButton("button2");
    private ButtonGroup group = new ButtonGroup();

    /* clicking this button should unselect both button1 and button2 */
    private JButton unselectRadio = new JButton("Unselect radio buttons.");

    /* In the constructor, set up the group and event listening */
    public RadioTest() {
        /* put the radio buttons in a group so they become mutually
         * exclusive -- without this, unselecting actually works! */
        group.add(button1);
        group.add(button2);

        /* listen to clicks on 'unselectRadio' button */
        unselectRadio.addActionListener(this);
    }

    /* called when 'unselectRadio' is clicked */
    public void actionPerformed(ActionEvent e) {
        /* variant1: disable both buttons directly.
         * ...doesn't work */
        button1.setSelected(false);
        button2.setSelected(false);

        /* variant2: disable the selection via the button group.
         * ...doesn't work either */
        group.setSelected(group.getSelection(), false);
    }

    /* Test: create a JFrame which displays the two radio buttons and
     * the unselect-button */
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        RadioTest test = new RadioTest();

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new GridLayout(3,1));
        contentPane.add(test.button1);
        contentPane.add(test.button2);
        contentPane.add(test.unselectRadio);

        frame.setSize(400, 400);
        frame.setVisible(true);
    }
}

Des idées n'importe qui? Merci!

32
Thomas

Vous pouvez faire buttonGroup.clearSelection() .

Mais cette méthode n'est disponible que depuis Java 6.

48

Le Javadoc de la classe ButtonGroup lui-même donne un indice sur la façon dont cela peut être réalisé:

Depuis le document API de la classe ButtonGroup:
Initialement, tous les boutons du groupe ne sont pas sélectionnés. Une fois qu'un bouton est sélectionné, un bouton est toujours sélectionné dans le groupe. Il n'y a aucun moyen de désactiver un bouton par programme sur "off", afin d'effacer le groupe de boutons. Pour donner l'apparence de "aucun sélectionné", ajoutez un bouton radio invisible au groupe, puis sélectionnez par programme ce bouton pour désactiver tous les boutons radio affichés.

5
sateesh

Essayez d'ajouter un troisième bouton invisible au groupe de boutons. Lorsque vous souhaitez "désélectionner", sélectionnez celui invisible.

3
Ash

Ou vous pouvez utiliser le Darryl Select Button Group qui ne vous oblige pas à utiliser un "bouton invisible".

3
camickr

Vous pouvez utiliser un compteur de clics:

private ButtonGroup radioGroup = new javax.swing.ButtonGroup();
private JRadioButton jRadioBtn1 = new javax.swing.JRadioButton();
private int clickCount = 0;

private void jRadioBtn1Clicked(Java.awt.event.MouseEvent evt) {                                             
    // Remove selection on a second click
    if (jRadioBtn1.isSelected()) {

        if (++clickCount % 2 == 0) {

            radioGroup.clearSelection();
        }
    }
}   
1
justDev7a3

Utilisez cette classe d'assistance SelectButtonGroup.Java lien direct vers la classe source

import Java.awt.*;
import Java.awt.event.ActionListener;
import javax.swing.*;

public class SelectUnselected extends JPanel {
    private static String birdString = "Bird";
    private static String catString = "Cat";
    private static Integer selectedIndex = -1;
    private static AbstractButton hiddenButton = new JRadioButton(catString);
    private final static AbstractButton birdButton = new JRadioButton(birdString);
    private final static AbstractButton catButton = new JRadioButton(catString);
    //Group the radio buttons.
    private SelectButtonGroup group = new SelectButtonGroup();

public SelectUnselected() {
    super(new BorderLayout());

    //Create the radio buttons.
    hiddenButton.setVisible(false);
    hiddenButton.setSelected(true);

    group.add(birdButton);
    group.add(catButton);
    group.add(hiddenButton);


    ActionListener sendListener = e -> {
        checkSelectedRadioButten();
    };
    birdButton.addActionListener(sendListener);
    catButton.addActionListener(sendListener);
    hiddenButton.addActionListener(sendListener);



    //Put the radio buttons in a column in a panel.
    JPanel radioPanel = new JPanel(new GridLayout(0, 1));
    radioPanel.add(birdButton);
    radioPanel.add(catButton);

    add(radioPanel, BorderLayout.LINE_START);
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}

public void checkSelectedRadioButten(){

    System.out.println("selectedIndex = " + selectedIndex + "\ngroup.getSelectedButton() = " + group.getSelectedIndex());
    if(group.getSelectedIndex() == selectedIndex){
        hiddenButton.setSelected(true);
        selectedIndex = -1;
        System.out.println("getText = " + group.getSelectedButton().getText());
    }else{
        selectedIndex = group.getSelectedIndex();
        System.out.println("getText = " + group.getSelectedButton().getText());
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame("RadioButtonDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JComponent newContentPane = new SelectUnselected();
    frame.setContentPane(newContentPane);
    frame.pack();
    frame.setVisible(true);

    }
}
0
Ar maj

Lorsque vous souhaitez désélectionner, sélectionnez invisible. Pour cela, vous ajoutez un troisième bouton invisible au groupe de boutons.

0
user1815823

Je ne sais pas si cela vous aidera, mais avez-vous essayé d'utiliser la méthode doClick()?

jRadioButtonYourObject.doClick();

Entrée - AUCUN

Retour - nul

J'ai eu un problème similaire et j'ai tout essayé en vain. J'ai donc jeté un coup d'œil à toutes les méthodes de JRadioButton et j'ai trouvé cette méthode dans la classe parent de JRadioButton.

Dans mon programme, j'avais deux boutons radio indépendants l'un de l'autre et il était programmé de sorte qu'un seul soit sélectionné.

Une fois que l'utilisateur a saisi des données et appuyé sur un bouton, le programme efface tous les champs et zones de texte et désélectionne le bouton radio. La doClick() a fait le travail de désélection du bouton radio pour moi; la méthode "effectue un" clic "".

Je sais que la vôtre est différente et vous devrez probablement programmer la méthode doClick () pour chaque bouton radio sélectionné.

http://docs.Oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html

recherchez doClick()

0
user2572559

Vous pouvez utiliser la méthode setselected(false) pour désélectionner le bouton sélectionné précédent.

0
user2205752

Dans mon cas, j'utilise le projet Jgoodies pour lier les composants GUI au modèle Java. Le composant RadioButton est lié à un champ

class Model {
  private SomeJavaEnum field; // + getter, setter
}

Dans ce cas, ButtonGroup.clearSelection Ne fonctionne pas car l'ancienne valeur est toujours conservée dans le modèle. La solution la plus simple consistait à simplement setField(null).

0
Tomáš Záluský