Como posso rcuperar o botão selecionado em ButtonGroup?
o getSelected() retorn um button model, que não é exatamente o que eu preciso
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
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