Bom dia a todos.
Este post não é uma pergunta, mas sim uma dica de um componente em Java que criei, que agrupa os componentes “RadioButtons”. Voce deve estar imaginando; “Mas já existe o ButtonGroup”, sim existe, porém eu o considero muito pobre de recursos, além disso, não dispõe de interface gráfica, onde além de criar o ButtonGroup, você tem que colocar os seus RadioButtons dentro de um JPanel.
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 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);
}
}
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++){
JRadioButton radio = (JRadioButton)getComponent(i);
radio.setSelected(false);
}
}
public Integer getIndexSelected() {
Integer sel = -1;
for (int i = 0; i < getComponentCount(); i++){
JRadioButton radio = (JRadioButton)getComponent(i);
if (radio.isSelected()){
sel = i;
break;
}
}
return sel;
}
public void setSelected(Integer index){
clearSelection();
if (index >= 0){
JRadioButton radio = (JRadioButton)getComponent(index);
radio.setSelected(true);
}
}
public Boolean isSelected(){
if (getSelected() >= 0){
return true;
} else {
return false;
}
}
public Integer getColumns() {
if (columns <= 0) columns = 1;
return columns;
}
public void setColumns(Integer columns) {
this.columns = columns;
}
public void addButtonActionListener(ActionListener listen){
for (int i = 0; i < getButtonCount(); i++){
JRadioButton radio = (JRadioButton)getComponent(i);
radio.addActionListener(listen);
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
for (int i = 0; i < getButtonCount(); i++){
JRadioButton radio = (JRadioButton)getComponent(i);
radio.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 radio = (JRadioButton)e.getSource();
radio.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 GroupRadioCheck grc;
public FramePrincipal(){
setLayout(new BorderLayout());
String[] radiobtn = {
"A vista em dinheiro",
"A vista em débito automático",
"A crédito no cartão Mastercard",
"A crédito no cartão Visa",
"A crédito no boleto bancário",
"A crédito no cheque",
"Reserva de capital"
};
grc = new GroupRadioButton(3);
grc.setTitleBorder("Formas de pagamento", Color.BLACK, 2);
grc.addButtons(radiobtn);
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);
setVisible(true);
}
public static void main(String[] args) {
new FramePrincipal();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==btndesmarcar){
grc.clearSelection();
text.setText("");
} else if (grc.isSelected()){
text.setText(e.getActionCommand());
}
}
}
Rode esse programa e veja se tem utilidade pra você.
Aguardo os comentários, inclusive críticas construtivas para melhorarmos ainda mais.