Dica de construção do componente GroupRadioButton

1 resposta
discorpio

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.

1 Resposta

discorpio

Up’s

Criado 4 de agosto de 2010
Ultima resposta 6 de ago. de 2010
Respostas 1
Participantes 1