Button Group

Como posso rcuperar o botão selecionado em ButtonGroup?

o getSelected() retorn um button model, que não é exatamente o que eu preciso

O método que retorna se um JRadioButton está selecionado ([color=darkblue]true[/color]) ou não ([color=darkblue]false[/color])
é o isSelected()

Como mostra o exemplo:

[code]public class JavaApplication extends JFrame {

private ButtonGroup grupoBtn = new ButtonGroup();
private JRadioButton btn1 = new JRadioButton("Botão 1");
private JRadioButton btn2 = new JRadioButton("Botão 2");
private JRadioButton btn3 = new JRadioButton("Botão 3");

public JavaApplication() {
    super.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    super.setSize(200, 200);
    super.setLayout(new FlowLayout());
    grupoBtn.add((btn1));
    grupoBtn.add((btn2));
    grupoBtn.add((btn3));
    super.add(btn1);
    super.add(btn2);
    super.add(btn3);
    btnSelecionado(btn1);
    btnSelecionado(btn2);
    btnSelecionado(btn3);
}

public void btnSelecionado(JRadioButton btn) {
    btn.addMouseListener(new java.awt.event.MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent event) {
            if (btn1.isSelected()) {
                JOptionPane.showMessageDialog(null, "Botão 1 está selecionado");
            } else if (btn2.isSelected()) {
                JOptionPane.showMessageDialog(null, "Botão 2 está selecionado");
            } else if (btn3.isSelected()) {
                JOptionPane.showMessageDialog(null, "Botão 3 está selecionado");
            }
        }
    });
}

public static void main(String[] args) {
    new JavaApplication().setVisible(true);
}

}[/code]

valeu. mas esse é o único jeito? sou obrigado a manter referências pros botões? gostaria de manter só o button group, já que ele tem referências (AbstractButton) pros botões.

Creio que exista outras maneiras melhores :slight_smile:

Este foi o jeito POG que eu já utilizei :oops:

Por incrível que pareça (e a razão eu realmente não entendi até hoje), o ButtonGroup não tem um método para retornar que botão está selecionado.

Tem que guardar a referência para os botões mesmo.

Boa tarde a todos.

É por esta razão que resolvi criar o meu próprio componente que agrupa RadioButtons, e o denominei GroupRadioButtons.

Este componente eu o dispus em duas classes, mas porque duas classes ? Simples, a classe ContentLayout e também uma classe que criei que utiliza o GridBagLayout, o qual me dispõe de um layout que me facilita colocar componentes em linha e coluna especificando-as, o GridLayout não permite especificá-las na posição que eu quero, apenas acrescentá-las colocando os componentes nas células a medida que vão sendo acrescentados, além disso, o GridBagLayout permite você extender o componente em mais de um linha ou coluna, portanto, essa classe não só serve para a classe GroupRadioButton que criei, mas sim para os demais JFrames, JDialogs e etc. Vamos digitar primeiro a classe ContentLayout.

import java.awt.Color;   
import java.awt.Component;   
import java.awt.Dimension;   
import java.awt.Font;   
import java.awt.GridBagConstraints;   
import java.awt.GridBagLayout;   
import java.awt.Insets;   
import javax.swing.BorderFactory;   
import javax.swing.border.Border;   
  
public class ContentLayout extends JPanel {   
  
        // Definição dos atributos do Layout e constraints do Layout   
        private GridBagLayout layout;   
        private GridBagConstraints constraints;   
        private Dimension size;   
        public final int horizontal = GridBagConstraints.HORIZONTAL;   
        public final int both = GridBagConstraints.BOTH;   
  
        //Construtor do objeto 
        public ContentLayout(){   
              layout = new GridBagLayout();   
              setLayout(layout);   
              constraints = new GridBagConstraints();   
              constraints.weightx = 0;   
              constraints.weighty = 0;   
              constraints.insets = new Insets(5,5,5,5);   
        }   
  
        // Método que acrescenta o componente no panel   
        public void addComponent(Component comp, int row, int column, int width, int height, int fill){   
              constraints.fill = fill;   
              constraints.gridx = column;   
              constraints.gridy = row;   
              constraints.gridwidth = width;   
              constraints.gridheight = height;   
              layout.setConstraints(comp, constraints);   
              add(comp);   
        }   
  
        // Método que cria uma borda quadrada, indicando cor e espessura da borda   
        public void setBorder(Color color, int thickness){   
              super.setBorder(BorderFactory.createLineBorder(color, thickness));   
        }   
        
        // Método que coloca um título no panel sem borda   
        public void setTitleBorder(String title){   
              setBorder(BorderFactory.createTitledBorder(title));   
        }   
        
        // Método que coloca um título no panel com borda   
        public void setTitleBorder(String title, Color color, int thickness){   
             setBorder(BorderFactory.createLineBorder(color, thickness));   
             setBorder(BorderFactory.createTitledBorder(getBorder(), title));   
        }   
  
        // Método que define a font de todos os componentes inseridos   
        public void setFontAllComp(String type, int size){   
            Font font = new Font(type,0,size);   
            for (int i=0; i<getComponentCount(); i++){   
                  getComponent(i).setFont(font);   
            }   
        }
}

Bom, voltando ao foco do post, agora vamos ao componente GroupRadioButton, eis a classe.

import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JRadioButton;

public class GroupRadioButton extends ContentLayout implements MouseListener {
    
   private Integer row, col, columns; 

   public GroupRadioButton(){
        super();
        row = 0;
        col = -1;
        columns = 1;
   } 

   public GroupRadioButton(Integer columns){
        super();
        row = 0;
        col = -1;
        this.columns = columns;
   }  

   public void addButton(String radiotext) {
        col++;
        if (col > (getColumns()-1)){
                col = 0;
                row++;
        }
        JRadioButton radiobtn = new JRadioButton(radiotext);
        radiobtn.setActionCommand(radiotext);
        radiobtn.addMouseListener(this);
        addComponent(radiobtn,row,col,1,1,horizontal);
   } 

   public void addButtons(String[] radiostext){
        for (int i = 0; i < radiostext.length; i++){
                addButton(radiostext[i]);
        }
   } 

   public Integer getButtonCount(){
        return getComponentCount();
   } 

   public void clearSelection(){
        for (int i = 0; i < getComponentCount(); i++){
                getRadioButton(i).setSelected(false);
        }
   }
        
   public Integer getSelected(){
        Integer sel = -1;
        for (int i = 0; i < getComponentCount(); i++){
                if (getRadioButton(i).isSelected()){
                    sel = i;
                    break;
                }
        }
        return sel;
   } 

   public void setSelectedIndex(int index){
        clearSelection();
        if (index >= 0){
            getRadioButton(index).setSelected(true);
        }
   }  

  public void setSelectedItem(String radioname){
        clearSelection();
        for (int i = 0; i < getComponentCount(); i++){
              if (radioname.equals(getRadioButton(i).getActionCommand())){
                   getRadioButton(i).setSelected(true);
                   break;
              }
        }
  }  

  public Integer getColumns() {
        if (columns <= 0) columns = 1;
        return columns;
  } 

   public void setColumns(Integer columns) {
        this.columns = columns;
   } 

   public JRadioButton getRadioButton(int index){
        if (index >= 0){
                return (JRadioButton)getComponent(index);
        } else {
                return null;
        }
   }
    
    public void addButtonActionListener(ActionListener listen){
        for (int i = 0; i < getComponentCount(); i++){
               getRadioButton(i).addActionListener(listen);
        }
    }

    public Boolean isSelected(){
        if (getSelected() >= 0){
                return true;
        } else {
                return false;
        }
    } 

   @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        for (int i = 0; i < getComponentCount(); i++){
                getRadioButton(i).setEnabled(enabled);
        }
   } 

   public void mouseClicked(MouseEvent e) {
        // Evento não utilizado porém precisa ser declarado
   } 

   public void mousePressed(MouseEvent e) {
        if (isEnabled()) clearSelection();
   }

   public void mouseReleased(MouseEvent e) {
        if (isEnabled()){
             JRadioButton btn = (JRadioButton)e.getSource();
             btn.setSelected(true);
        }
   } 

   public void mouseEntered(MouseEvent e) {
        // Evento não utilizado porém precisa ser declarado
   } 

   public void mouseExited(MouseEvent e) {
        // Evento não utilizado porém precisa ser declarado
   }
}

Neste componente, você pode utilizar o método "getSelected()" que ele vai te retornar o RadioButton selecionado, além disso, voce pode selecionar por este componente, qualquer um dos RadioButtons criados, através dos métodos "setSelectedIndex(int index)" fornecendo o índice do radiobutton e "setSelectedItem(String radioname)" fornecendo o texto do radiobutton. Além disso, você só precisa fornecer os textos dos radiobuttons, que já cria os mesmos automaticamente pra você, como :?: :?: :?: Assim oh :

// Instancição normal com uma coluna padrão
GroupRadioButton grc = new GroupRadioButton(); 

// Ou especificando colunas
GroupRadioButton grc = new GroupRadioButton(3);

// Ou instanciando padrão e depois setando as colunas
GroupRadioButton grc = new GroupRadioButton(); 
grc.setColumns(3);

// Um exemplo completo:
import componentes.GroupRadioButton;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class FramePrincipal extends JFrame implements ActionListener {

        private JButton btndesmarcar;
        private JTextField text;
        private GroupRadioButton grc;

        public FramePrincipal(){
            setLayout(new BorderLayout());
            String[] radiotxt = {
                "MasterCard",
                "Visa",
                "Cheque",
                "Débito automático",
                "Dinheiro",
                "Boleto bancário",
                "Reserva"
            };
            grc = new GroupRadioButton(4);
            grc.setTitle("Condição de pagamento", Color.BLUE, 2);
            grc.addButtons(radiotxt);
            grc.addButtonActionListener(this);
            add(grc, BorderLayout.NORTH);
            btndesmarcar = new JButton("Desmarcar");
            btndesmarcar.addActionListener(this);
            add(btndesmarcar, BorderLayout.CENTER);
            text = new JTextField();
            add(text, BorderLayout.SOUTH);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            pack();
            setLocationRelativeTo(null);
        }

        public void actionPerformed(ActionEvent e) {
            if (e.getSource()==btndesmarcar){
                grc.clearSelection();
                text.setText("");
            } else {
                text.setText(e.getActionCommand());
            }
        }
}

Um abraço