Làm cách nào để lấy JRadioButton nào được chọn từ Nhóm Nút


77

Tôi có một ứng dụng đu bao gồm các nút radio trên một biểu mẫu. Tôi có ButtonGroup, tuy nhiên, nhìn vào các phương pháp có sẵn, tôi dường như không thể lấy được tên của phương thức đã chọn JRadioButton. Đây là những gì tôi có thể nói cho đến nay:

  • Từ ButtonGroup, tôi có thể thực hiện getSelection()để trả về ButtonModel. Từ đó, tôi có thể thực hiện một getActionCommand, nhưng điều đó dường như không phải lúc nào cũng hiệu quả. Tôi đã thử các bài kiểm tra khác nhau và nhận được kết quả không thể đoán trước.

  • Ngoài ra ButtonGroup, tôi có thể nhận được một Bảng kê từ getElements(). Tuy nhiên, sau đó tôi sẽ phải lặp lại từng nút chỉ để kiểm tra và xem nó có phải là nút được chọn hay không.

Có cách nào dễ dàng hơn để tìm ra nút nào đã được chọn không? Tôi đang lập trình điều này trong Java 1.3.1 và Swing.


Java 1.3.1? Như chỉ được hỗ trợ trên Solaris 8 cổ điển và không có lỗi nào từ tháng 4?
Tom Hawtin - tackline

Vâng, tôi biết. Máy tính để bàn mà tôi đang phát triển ứng dụng này có các ứng dụng cũ hơn vẫn chạy trên phiên bản này và tôi không muốn làm phiền điều đó.
Joel

Câu trả lời:


41

Tôi sẽ chỉ lặp lại của bạn JRadioButtonsvà gọi isSelected(). Nếu bạn thực sự muốn đi từ đó, ButtonGroupbạn chỉ có thể đến các mô hình. Bạn có thể kết hợp các mô hình với các nút, nhưng nếu bạn có quyền truy cập vào các nút, tại sao không sử dụng chúng trực tiếp?


1
vui lòng xem xét bài đọc này: javaworld.com/article/2077509/core-java/…
Victor

5
@Thufir: ButtonGroup nói với Java rằng chỉ nên chọn các JRadioButtons của nhóm. không có điều đó, tất cả chúng có thể được chọn đồng thời.
Makan Tayebi

75

Tôi gặp sự cố tương tự và đã giải quyết được vấn đề này:

import java.util.Enumeration;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;

public class GroupButtonUtils {

    public String getSelectedButtonText(ButtonGroup buttonGroup) {
        for (Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();) {
            AbstractButton button = buttons.nextElement();

            if (button.isSelected()) {
                return button.getText();
            }
        }

        return null;
    }
}

Nó trả về văn bản của nút đã chọn.


Tôi nghĩ bạn chỉ nên đăng phương pháp 'getSelectedButtonText' làm câu trả lời. Câu trả lời hoàn hảo ty!
Petro

4
Giải pháp tốt, để lấy văn bản của một nút đã chọn - NHƯNG ta nên biết rằng đầu ra thay đổi khi nút được đổi tên (ví dụ: khi được dịch). Việc ràng buộc bất kỳ chức năng nào với văn bản được hiển thị trong GUI không được khuyến khích.
GameDroids

32

Bạn phải thêm setActionCommandvào JRadioButtonsau đó chỉ cần làm:

String entree = entreeGroup.getSelection().getActionCommand();

Thí dụ:

java = new JRadioButton("Java");
java.setActionCommand("Java");
c = new JRadioButton("C/C++");
c.setActionCommand("c");
System.out.println("Selected Radio Button: " + 
                    buttonGroup.getSelection().getActionCommand());

5

Tôi khuyên bạn nên đi thẳng vào cách tiếp cận mô hình trong Swing. Sau khi bạn đã đặt thành phần vào trình quản lý bảng điều khiển và bố cục, thậm chí đừng bận tâm đến việc giữ một tham chiếu cụ thể về nó.

Nếu bạn thực sự muốn tiện ích con, thì bạn có thể kiểm tra từng tiện ích với isSelectedhoặc duy trì một Map<ButtonModel,JRadioButton>.


4

Bạn có thể đặt và actionCommand cho mỗi nút radio (chuỗi).

this.jButton1.setActionCommand("dog");
this.jButton2.setActionCommand("cat");
this.jButton3.setActionCommand("bird");

Giả sử họ đã ở trong Nhóm nút (state_group trong trường hợp này), bạn có thể nhận được nút radio đã chọn như sau:

String selection = this.state_group.getSelection().getActionCommand();

Hi vọng điêu nay co ich


2

Đoạn mã sau hiển thị nút JRadio nào được chọn từ Buttongroup khi nhấp vào nút.
Nó được thực hiện bằng cách lặp qua tất cả các JRadioButtons trong một buttonGroup cụ thể.

 JRadioButton firstRadioButton=new JRadioButton("Female",true);  
 JRadioButton secondRadioButton=new JRadioButton("Male");  

 //Create a radio button group using ButtonGroup  
 ButtonGroup btngroup=new ButtonGroup();  

 btngroup.add(firstRadioButton);  
 btngroup.add(secondRadioButton);  

 //Create a button with text ( What i select )  
 JButton button=new JButton("What i select");  

 //Add action listener to created button  
 button.addActionListener(this);  

 //Get selected JRadioButton from ButtonGroup  
  public void actionPerformed(ActionEvent event)  
  {  
     if(event.getSource()==button)  
     {  
        Enumeration<AbstractButton> allRadioButton=btngroup.getElements();  
        while(allRadioButton.hasMoreElements())  
        {  
           JRadioButton temp=(JRadioButton)allRadioButton.nextElement();  
           if(temp.isSelected())  
           {  
            JOptionPane.showMessageDialog(null,"You select : "+temp.getText());  
           }  
        }            
     }
  }

2
hmm ... điều này khác với câu trả lời trước đó ở chỗ ..?
kleopatra,

0

Bạn có thể sử dụng getSelectedObjects () của ItemSelectable (siêu giao diện của ButtonModel) để trả về danh sách các mục đã chọn. Trong trường hợp nhóm nút radio, nó chỉ có thể là một hoặc không có.


1
Tôi đã thử, điều này nhưng tôi nhận được NPE. Tôi đã thực hiện một nghiên cứu nhỏ và tìm thấy điều này: java.sun.com/javase/6/docs/api/javax/swing/… Vì mô hình nút của JRadioButton là JToggleButton.ToggleButtonModel, nó sẽ luôn trả về giá trị rỗng.
Joel

0

Thêm các nút radio vào một nhóm nút, sau đó:

buttonGroup.getSelection (). getActionCommand


không trả lời câu hỏi (mà là để có được những lựa chọn JRadioButton vs actionCommand của nó)
Kleopatra

0
import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;

public class RadioButton extends JRadioButton {

    public class RadioButtonModel extends JToggleButton.ToggleButtonModel {
        public Object[] getSelectedObjects() {
            if ( isSelected() ) {
                return new Object[] { RadioButton.this };
            } else {
                return new Object[0];
            }
        }

        public RadioButton getButton() { return RadioButton.this; }
    }

    public RadioButton() { super(); setModel(new RadioButtonModel()); }
    public RadioButton(Action action) { super(action); setModel(new RadioButtonModel()); }
    public RadioButton(Icon icon) { super(icon); setModel(new RadioButtonModel()); }
    public RadioButton(String text) { super(text); setModel(new RadioButtonModel()); }
    public RadioButton(Icon icon, boolean selected) { super(icon, selected); setModel(new RadioButtonModel()); }
    public RadioButton(String text, boolean selected) { super(text, selected); setModel(new RadioButtonModel()); }
    public RadioButton(String text, Icon icon) { super(text, icon); setModel(new RadioButtonModel()); }
    public RadioButton(String text, Icon icon, boolean selected) { super(text, icon, selected); setModel(new RadioButtonModel()); }

    public static void main(String[] args) {
        RadioButton b1 = new RadioButton("A");
        RadioButton b2 = new RadioButton("B");
        ButtonGroup group = new ButtonGroup();
        group.add(b1);
        group.add(b2);
        b2.setSelected(true);
        RadioButtonModel model = (RadioButtonModel)group.getSelection();
        System.out.println(model.getButton().getText());
    }
}

0

Sử dụng isSelected()phương pháp. Nó sẽ cho bạn biết trạng thái của radioButton của bạn. Sử dụng nó kết hợp với một vòng lặp (ví dụ như vòng lặp for), bạn có thể tìm thấy cái nào đã được chọn.


0
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 
public class MyJRadioButton extends JFrame implements ActionListener
{
    JRadioButton rb1,rb2;  //components
    ButtonGroup bg;
    MyJRadioButton()
{
    setLayout(new FlowLayout());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    rb1=new JRadioButton("male");
    rb2=new JRadioButton("female");

    //add radio button to button group
    bg=new ButtonGroup();
    bg.add(rb1);
    bg.add(rb2);

    //add radio buttons to frame,not button group
    add(rb1);
    add(rb2);
    //add action listener to JRadioButton, not ButtonGroup
    rb1.addActionListener(this);
    rb2.addActionListener(this);
    pack();
    setVisible(true);
}
public static void main(String[] args)
{
    new MyJRadioButton(); //calling constructor
}
@Override
public void actionPerformed(ActionEvent e) 
{
    System.out.println(((JRadioButton) e.getSource()).getActionCommand());
}

}


1
Trong khi đoạn này có thể trả lời câu hỏi là tốt hơn để giải thích cách nó giải quyết vấn đề OP
jean

0

Thông thường, một số đối tượng được liên kết với nút radio đã chọn là bắt buộc. Nó không nhất thiết phải Stringđại diện cho nhãn của nút. Nó có thể là một Integerchứa chỉ mục của nút hoặc một đối tượng thuộc loại phức tạp hơn T. Bạn có thể điền và sử dụng một Map<ButtonModel, T>như Tom Hawtin đề xuất, nhưng tôi đề xuất mở rộng mô hình và đặt các đối tượng ở đó. Đây là một cải tiến ButtonGroupsử dụng phương pháp này.

import javax.swing.*;

@SuppressWarnings("serial")
public class SmartButtonGroup<T> extends ButtonGroup {
    @Override
    public void add(AbstractButton b) {
        throw new UnsupportedOperationException("No object supplied");
    }

    public void add(JRadioButton button, T attachedObject) {
        ExtendedModel<T> model = new ExtendedModel<>(attachedObject);
        model.setSelected(button.isSelected());
        button.setModel(model);
        super.add(button);
    }

    @SuppressWarnings("unchecked")
    public T getSelectedObject() {
        ButtonModel selModel = getSelection();
        return selModel != null ? ((ExtendedModel<T>)selModel).obj : null;
    }

    public static class ExtendedModel<T> extends javax.swing.JToggleButton.ToggleButtonModel {
        public T obj;

        private ExtendedModel(T object) {
            obj = object;
        }
    }
}

Bạn có thể sử dụng lớp tiện ích này thay vì ButtonGroup. Tạo một đối tượng của lớp này và thêm các nút cùng với các đối tượng liên kết với nó. Ví dụ,

SmartButtonGroup<Integer> group = new SmartButtonGroup<>();
JPanel panel = new JPanel();

for (int i = 1; i <= 5; i++) {
    JRadioButton button = new JRadioButton("Button #" + i, i == 3); // select the 3rd button
    group.add(button, i);
    panel.add(button);
}

Sau đó, bạn có thể lấy đối tượng được liên kết với nút hiện được chọn bất cứ lúc nào bạn cần bằng cách chỉ cần gọi getSelectedObject(), như sau:

int selectedButtonIndex = group.getSelectedObject();

Trong trường hợp bạn chỉ cần các nút, bạn có thể sử dụng lớp không chung chung tiếp theo để thay thế.

import javax.swing.JRadioButton;

@SuppressWarnings("serial")
public class RadioButtonGroup extends SmartButtonGroup<JRadioButton> {
    public void add(JRadioButton button) {
        super.add(button, button);
    }

    @Override
    public void add(JRadioButton button, JRadioButton attachedObject) {
        throw new UnsupportedOperationException("Use the short form of addition instead");
    }

    public JRadioButton getSelectedButton() {
        return getSelectedObject();
    }
}

-3
jRadioOne = new javax.swing.JRadioButton();
jRadioTwo = new javax.swing.JRadioButton();
jRadioThree = new javax.swing.JRadioButton();

... sau đó đối với mọi nút:

buttonGroup1.add(jRadioOne);
jRadioOne.setText("One");
jRadioOne.setActionCommand(ONE);
jRadioOne.addActionListener(radioButtonActionListener);

...người nghe

ActionListener radioButtonActionListener = new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioButtonActionPerformed(evt);
            }
        };

... làm bất cứ điều gì bạn cần để đáp ứng sự kiện

protected void radioButtonActionPerformed(ActionEvent evt) {            
       System.out.println(evt.getActionCommand());
    }

2
Điều đó làm nhầm lẫn các sự kiện đầu vào và thay đổi trạng thái. Mã khác có thể thay đổi trạng thái. Nó cũng tránh xa mô hình nhóm nút.
Tom Hawtin - tackline
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.