JRadioButton - Botão de Rádio ou de Opção (Tutorial de Java GUI)

Neste Tutorial de GUI em Java, vamos falar dos Radio Buttons, também conhecidos por botão de opção ou botão de rádio, que são usados para fazer escolhas únicas:

Curso de Java completo online grátis com certificado

Apostila de Java completa para download pdf


JRadioButton em Java - O Que É e Para Que Serve

Certamente você já se deparou com algum Radio Button em algum aplicativo ou site, pois são muito comuns e usados no mundo da informática.

São aquelas "bolinhas" que você clica para marcar e fazer uma escolha.
Mas essa escolha é única, dentre todas as opções, você só pode marcar uma e é isso que difere o JRadioButton do JCheckBox, é que nas caixas de checagem você pode marcar várias opções ao mesmo tempo.

Logo, você deve usar os JRadioButton's quando quer oferecer uma diversidade de opções, mas somente uma delas deve ser marcada.
Por exemplo: 
"Você quer programar em Java?"
Sim
Não

"Qual sua faixa de idade?"
Menos 12 anos
Entre 12 e 18 anos
Acima de 18 anos

No primeiro exemplo, ou você quer programar em Java, ou não. Não há duas respostas.
No segundo exemplo, idem. Ou tem menos de 12 anos, ou tem entre 12 e 18 ou tem mais, não há uma opção e outra ao mesmo tempo.

Essa é a ideia, a lógica por trás dos Radio Buttons, ou botões de opção: use quando a resposta for somente uma.

Como Usar Radio Button em Java - JRadioButton

Agora que já sabemos o que é um Radio Button, para que serve e em que situações são usados, vamos aprender como programar eles em Java. Vamos fazer o exemplo das duas imagens iniciais deste artigo.

Para tal, vamos iniciar importando a classe JRadioButton:
import javax.swing.JRadioButton;

Vamos criar dois botões de rádio, um para a opção Java e outro para C# (csharp), além de um JLabel para exibir o texto "Qual a melhor linguagem de Programação?"

Para inicializar nossos Botões de Opção, devemos fornecer duas coisas para o construtor JRadioButton, que é uma string com o texto que vai aparecer nas opções (no caso, "Java" e "C#") e o estado inicial do botão.

Note que o botão pode estar marcado ou desmarcado.
Se quiser que seu aplicativo Java inicie um um Radio Button marcado coloque true, ou false para desmarcado.
Vamos inicializar os nossos desmarcados:

Depois simplesmente adicionamos o label e os radio buttons (na ordem do FlowLayout).

RadioButton Handler - Eventos com os Botões de Rádio

Como sempre, elementos gráficos em Java sem um handler, não são muito úteis.
O bacana é que certos eventos e ações ocorram quando formos interagir com esses elementos.

Ou seja, vamos criar nosso handler, para que as coisas aconteçam quando selecionarmos "Java" ou "C#" no nosso aplicativo.

Vamos criar nossa classe privada interna chamada "RadioButtonHandler" que deve, obrigatoriamente, implementar a interface "ItemListener".
Nessa interface, devemos implementar, obrigatoriamente, o método itemStateChanged.

Esse método que vai "ficar de olho" se algo foi clicado, marcado ou desmarcado.
Já que ele vai ficar atento se algo ocorre...o que pode ocorrer?
Ora, um radio button ser marcado ou desmarcado.

O método que retorna true se ele for marcado e false se for desmarcado é o "isSelected()", presente em todo objeto do tipo JRadioButton.
Colocamos esses métodos dentro de testes condicionais IF.

Caso "java.isSelected()" seja verdadeiro (seja selecionado), exibimos um JOptionPane com a mensagem  de parabéns. Caso "csharp.isSelected()" que retorne verdadeiro, mandamos a mensagem de "Sabe de nada, inocente".

Mas claro, para que tudo ocorra, devemos criar um handler (objeto do tipo RadioButtonHandler) e fazer com que os objetos "java" e "csharp" tenham seus eventos tratados por um handler dessa classe.
Isso é feito através do método "addItemListener" da classe JRadioButton.


Código Fonte do Tutorial de Java

Vamos ver agora tudo funcionando.
Crie seu projeto Java, e as duas classes "Main.java" e "RadioButton.java"

Main.java

import javax.swing.JFrame;

public class Main {

 public static void main(String[] args) {
  RadioButton radioButtonFrame = new RadioButton();
  radioButtonFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  radioButtonFrame.setSize( 350, 100 );
  radioButtonFrame.setVisible( true );

 }

}

RadioButton.java

import javax.swing.JFrame;
import javax.swing.JRadioButton;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class RadioButton extends JFrame {
 private JRadioButton java,
        csharp;
 private JLabel myLabel;
 private RadioButtonHandler handler;
 
 public RadioButton(){
  super("Radio Buttons - JavaProgressivo.net");
  setLayout( new FlowLayout() );
  handler = new RadioButtonHandler();
  
  myLabel = new JLabel("Qual a melhor linguagem de programação?");
  java = new JRadioButton("Java", false);
  csharp = new JRadioButton("C#", false);
  
  add(myLabel);
  add(java);
  add(csharp);

  java.addItemListener(handler);
  csharp.addItemListener(handler);
 }
 
 private class RadioButtonHandler implements ItemListener{

  @Override
  public void itemStateChanged(ItemEvent event) {
   if(java.isSelected())
    JOptionPane.showMessageDialog(null,"Parabéns, você é o cara");
   if(csharp.isSelected())
    JOptionPane.showMessageDialog(null,"Sabe de nada, inocente!");
  }
  
 }

}


A Classe ButtonGroup do Java

Ok, é fácil entender que somente uma das opções dos botões de rádio devem ser escolhida.
Mas se tivermos grupos diferentes de botões?

Por exemplo, se querermos saber que linguagem o usuário quer estudar (que gera somente uma resposta) e também queremos saber em que estado brasileiro ele mora (usando radio buttons também) ?

Obviamente queremos ter alguns radio buttons para a primeira pergunta e outros botões para a outra pergunta. Mas vimos que o Java só deixa a gente selecionar uma opção como resposta, o que fazer?

A resposta é: agrupar os botões usando o ButtonGroup.
Importe essa classe:
import javax.swing.ButtonGroup;

E declare objetos que serão os grupos.
Vamos fazer duas perguntas no próximo exemplo, a primeira é "Que linguagem você deseja aprender" e a segunda é "Tem certeza?".

Vamos criar então mais dois JRadioButtons, o "sim" e o "nao", bem como outro JLabel para o outro texto da pergunta.

Vamos criar dois grupos, o "grupo1" e o "grupo2", que são objetos da classe ButtonGroup.
Esses objetos possuem o método "add()" para adicionamos os JRadioButtons separadamente.

Ou seja, no "grupo1" colocamos os botões "Java" e "C#", já no "grupo2" colocamos os botões "sim" e "nao".
Simples!

Agora vamos adicionar nosso objeto handler nesses botões "sim" e "nao", e dentro da classe RadioButtonHandler vamos fazer com que as mensagens sejam exibidas somente se o usuário clicar na linguagem que deseja aprender e no "Sim".

Código Fonte do Tutorial de Java


import javax.swing.JFrame;

public class Main {

 public static void main(String[] args) {
  RadioButton radioButtonFrame = new RadioButton();
  radioButtonFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  radioButtonFrame.setSize( 450, 100 );
  radioButtonFrame.setVisible( true );

 }

}

RadioButton.java

import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class RadioButton extends JFrame {
 private JRadioButton java, csharp,
        sim, nao;
 private JLabel myLabel, myLabel2;
 private ButtonGroup grupo1, grupo2;
 private RadioButtonHandler handler;
 
 public RadioButton(){
  super("Radio Buttons - JavaProgressivo.net");
  setLayout( new FlowLayout() );
  handler = new RadioButtonHandler();
  
  myLabel = new JLabel("Qual a melhor linguagem de programação?");
  myLabel2 = new JLabel("\nVocê tem certeza disso?");
  java = new JRadioButton("Java", false);
  csharp = new JRadioButton("C#", false);
  sim = new JRadioButton("Sim", false);
  nao = new JRadioButton("Não", false);
  
  add(myLabel);
  add(java);
  add(csharp);
  add(myLabel2);
  add(sim);
  add(nao);
  
  grupo1 = new ButtonGroup();
  grupo1.add(java);
  grupo1.add(csharp);
  
  grupo2 = new ButtonGroup();
  grupo2.add(sim);
  grupo2.add(nao);
  
  java.addItemListener(handler);
  csharp.addItemListener(handler);
  sim.addItemListener(handler);
  nao.addItemListener(handler);
 }
 
 private class RadioButtonHandler implements ItemListener{

  @Override
  public void itemStateChanged(ItemEvent event) {
   if(java.isSelected() && sim.isSelected())
    JOptionPane.showMessageDialog(null,"Parabéns, você é o cara");
   if(csharp.isSelected() && sim.isSelected())
    JOptionPane.showMessageDialog(null,"Sabe de nada, inocente!");
  }
  
 }

}

4 comentários:

  1. Primeiramente: Parabéns e obrigado pelo blog. Além de fazer um excelente trabalho, me ajudou a gostar de programar em Java, o que eu sempre pensava ser uma coisa muito chata(programar).

    Segundo: Eu tenho um problema. Eu criei um programa gráfico para achar as raízes de uma equação de segundo grau, e queria ter a opção do usuário escolher se ele quer que aparece a raiz complexa ou não. Para isso, criei dois Radio Buttons, já que o usuário só pode escolher "Sim" ou "Não" como opção, mas quando clico em "Sim" e o botão "Não" está ativado, ele não desativa para que fique somente o "Sim" ativado, e vice-versa. O que posso estar fazendo de errado?
    PS: Estou usando o UI Designer para criar a interface gráfica, já que é mais fácil.

    Atenciosamente,
    Matheus.

    ResponderExcluir
  2. Matheus, você fez o método que agrupa o JRadioButtons? Porque, sem agrupá-los, um não é desmarcado quando o outro é marcado

    Gustavo

    ResponderExcluir
  3. JOptionPane.showMessageDialog(null,"Parabéns, você é o cara"); Excelente trabalho, mas não sejam machistas, mulheres também programam kkkkkkkkkkkk.

    ResponderExcluir