Boa tarde a todos.
Sinceramente eu acho esse componente ButtonGroup muito pobre de recursos, então eu resolvi criar o meu próprio componente ButtonGroup que além de agrupar, cria também automaticamente RadioButtons dentro de um JPanel e ainda coloca o título.
Eu o implementei em duas classes, a primeira para diagramar os RadioButtons dentro do JPanel, e a segunda cria os RadioButtons dentro do JPanel, vamos a elas:
// Classe de diagramação de componentes
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 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 (como o mesmo nome da classe)
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);
}
}
}
// Classe do componente RadioButton
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
}
}
Repare que com o GroupRadioButton, voce não precisa nem criar os RadioButtons, basta voce acrescentar os nomes dos mesmos um a um no método addButton(String radiotext) ou todos de uma vez atraves de um vetor de strings no método addButtons(String[] radiostext). Voce pode instanciá-lo de duas formas, a seguir:
// 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);
Vamos a um exemplo prático:
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);
setLocationRelativeTo(null);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==btndesmarcar){
grc.clearSelection();
text.setText("");
} else {
text.setText(e.getActionCommand());
}
}
}
Rode esse programa e veja se tem utilidade pra você.