2010-03-09 152 views
30

Khi hiển thị một nhóm JRadioButtons, ban đầu không có nhóm nào trong số chúng được chọn (trừ khi bạn thực thi chương trình đó). Tôi muốn có thể đặt các nút trở lại trạng thái đó ngay cả sau khi người dùng đã chọn một nút, nghĩa là không có nút nào được chọn.Bỏ chọn RadioButton trong Java Swing

Tuy nhiên, việc sử dụng các nghi phạm thông thường không mang lại hiệu quả cần thiết: gọi 'setSelected (false)' trên mỗi nút không hoạt động. Thật thú vị, nó hiện hoạt động khi các nút không được đưa vào một ButtonGroup - thật không may, sau này là cần thiết cho JRadioButtons để loại trừ lẫn nhau.

Ngoài ra, bằng cách sử dụng phương thức setSelected (ButtonModel, boolean) - của javax.swing.ButtonGroup không thực hiện những gì tôi muốn.

Tôi đã đặt cùng một chương trình nhỏ để minh họa hiệu ứng: hai nút radio và một nút JButton. Nhấp vào nút JButton sẽ bỏ chọn các nút radio để cửa sổ trông chính xác như khi nó xuất hiện lần đầu tiên.

import java.awt.Container; 
import java.awt.GridLayout; 
import java.awt.event.*; 
import javax.swing.*; 

/** 
* This class creates two radio buttons and a JButton. Initially, none 
* of the radio buttons is selected. Clicking on the JButton should 
* always return the radio buttons into that initial state, i.e., 
* should disable both radio buttons. 
*/ 
public class RadioTest implements ActionListener { 
    /* create two radio buttons and a group */ 
    private JRadioButton button1 = new JRadioButton("button1"); 
    private JRadioButton button2 = new JRadioButton("button2"); 
    private ButtonGroup group = new ButtonGroup(); 

    /* clicking this button should unselect both button1 and button2 */ 
    private JButton unselectRadio = new JButton("Unselect radio buttons."); 

    /* In the constructor, set up the group and event listening */ 
    public RadioTest() { 
     /* put the radio buttons in a group so they become mutually 
     * exclusive -- without this, unselecting actually works! */ 
     group.add(button1); 
     group.add(button2); 

     /* listen to clicks on 'unselectRadio' button */ 
     unselectRadio.addActionListener(this); 
    } 

    /* called when 'unselectRadio' is clicked */ 
    public void actionPerformed(ActionEvent e) { 
     /* variant1: disable both buttons directly. 
     * ...doesn't work */ 
     button1.setSelected(false); 
     button2.setSelected(false); 

     /* variant2: disable the selection via the button group. 
     * ...doesn't work either */ 
     group.setSelected(group.getSelection(), false); 
    } 

    /* Test: create a JFrame which displays the two radio buttons and 
    * the unselect-button */ 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     RadioTest test = new RadioTest(); 

     Container contentPane = frame.getContentPane(); 
     contentPane.setLayout(new GridLayout(3,1)); 
     contentPane.add(test.button1); 
     contentPane.add(test.button2); 
     contentPane.add(test.unselectRadio); 

     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

Bất kỳ ý tưởng nào? Cảm ơn!

+0

Một ví dụ sử dụng tổ hợp phím được hiển thị [ở đây] (http://stackoverflow.com/a/37599961/230513). – trashgod

Trả lời

44

Bạn có thể làm buttonGroup.clearSelection().

Nhưng phương pháp này chỉ có sẵn từ Java 6.

+1

Tuyệt vời! Điều đó giải thích tại sao Javadoc cho ButtonGroup loại bỏ một phần về RadioButton vô hình ... (Bây giờ, nếu chỉ có họ đã thêm * một phần về clearSelection ;-)) – Thomas

3

Thử thêm nút ẩn thứ ba vào nhóm nút. Khi bạn muốn "bỏ chọn", hãy chọn chế độ ẩn.

+0

Câu trả lời giống như sateesh - cảm ơn! – Thomas

5

Các Javadoc của lớp ButtonGroup tự đưa ra một số gợi ý về cách thức này có thể đạt được:

Từ doc API của lớp ButtonGroup:
Ban đầu, tất cả các nút trong nhóm là không được chọn. Khi bất kỳ nút nào được chọn, một nút luôn được chọn trong nhóm. Không có cách nào để bật nút lập trình thành "tắt", để xóa nhóm nút. Để hiển thị "không được chọn", hãy thêm nút radio vô hình vào nhóm và sau đó chọn chương trình đó để tắt tất cả các nút radio được hiển thị.

+0

Điều gì vô lý ... nhưng cảm ơn rất nhiều cho câu trả lời! – Thomas

+1

Ôi trời ... Tôi đã nghĩ một điều gì đó rất lạ, như tôi đã đọc qua tài liệu API trước đây. Bây giờ, nhận được điều này: chỉ ra phần bạn trích dẫn đã được * gỡ bỏ * từ tài liệu API với Java 6! Xem ở đây để so sánh: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ButtonGroup.html (Java 5) và http://java.sun.com/javase/ 6/docs/api/javax/swing/ButtonGroup.html (Java 6). Không có thắc mắc tôi không thể tìm thấy bất cứ điều gì trong tài liệu ... – Thomas

+0

@Thomas - Tôi đồng ý. Vô lý. Bleh. – JasCav

3

Hoặc bạn có thể sử dụng số điện thoại Select Button Group của Darryl không yêu cầu bạn sử dụng "nút ẩn".

0

Bạn có thể sử dụng phương pháp setselected(false) để bỏ chọn nút chọn trước.

+0

Như tôi đã nói trong câu hỏi của tôi (đoạn thứ hai), điều đó không làm việc cho tôi. Bạn có thể cung cấp một mẫu mã, xin vui lòng, để chứng minh những gì bạn có nghĩa là? – Thomas

0

Tôi không biết điều này có hữu ích không nhưng bạn đã thử sử dụng phương pháp doClick() chưa?

jRadioButtonYourObject.doClick(); 

Input - NONE

Return- trống

Tôi đã có một vấn đề tương tự và cố gắng tất cả mọi thứ trong chủ đề này không có kết quả. Vì vậy, tôi đã xem xét tất cả các phương pháp của JRadioButton và thấy rằng phương pháp từ lớp cha mẹ của JRadioButton.

Trong chương trình của mình, tôi có hai nút radio độc lập với nhau và nó được lập trình sao cho chỉ có một được chọn.

Sau khi người dùng nhập dữ liệu và nhấn nút, chương trình sẽ xóa tất cả các trường và vùng văn bản và bỏ chọn nút radio.Các doClick() đã làm công việc bỏ chọn nút radio cho tôi; phương pháp "thực hiện một" bấm "."

Tôi biết bạn là khác nhau và bạn có thể sẽ phải lập trình phương thức doClick() cho mọi nút radio được chọn.

http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html

tìm kiếm doClick()

+0

* Bạn đã thử sử dụng phương thức 'doClick()' chưa? [..] Tôi đã có một vấn đề tương tự và cố gắng tất cả mọi thứ trong chủ đề này để avail không có. * - Câu trả lời tôi đã chọn là công trình chính xác cho tôi. – Thomas

0

Khi bạn muốn bỏ chọn, chọn vô hình. Cho rằng bạn thêm một nút vô hình thứ ba vào nhóm nút.

+0

Xem câu trả lời của sateesh và cả camickr's. – Thomas

0

Trong trường hợp của tôi, tôi sử dụng dự án Jgoodies để ràng buộc các thành phần GUI với mô hình Java. phần Các RadioButton được ràng buộc vào một lĩnh vực

class Model { 
    private SomeJavaEnum field; // + getter, setter 
} 

Trong trường hợp này ButtonGroup.clearSelection không hoạt động vì giá trị cũ vẫn giữ lại trong mô hình. Giải pháp đơn giản chỉ đơn giản là setField(null).

0

Sử dụng lớp helper này SelectButtonGroup.java liên kết trực tiếp đến lớp source

import java.awt.*; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class SelectUnselected extends JPanel { 
    private static String birdString = "Bird"; 
    private static String catString = "Cat"; 
    private static Integer selectedIndex = -1; 
    private static AbstractButton hiddenButton = new JRadioButton(catString); 
    private final static AbstractButton birdButton = new JRadioButton(birdString); 
    private final static AbstractButton catButton = new JRadioButton(catString); 
    //Group the radio buttons. 
    private SelectButtonGroup group = new SelectButtonGroup(); 

public SelectUnselected() { 
    super(new BorderLayout()); 

    //Create the radio buttons. 
    hiddenButton.setVisible(false); 
    hiddenButton.setSelected(true); 

    group.add(birdButton); 
    group.add(catButton); 
    group.add(hiddenButton); 


    ActionListener sendListener = e -> { 
     checkSelectedRadioButten(); 
    }; 
    birdButton.addActionListener(sendListener); 
    catButton.addActionListener(sendListener); 
    hiddenButton.addActionListener(sendListener); 



    //Put the radio buttons in a column in a panel. 
    JPanel radioPanel = new JPanel(new GridLayout(0, 1)); 
    radioPanel.add(birdButton); 
    radioPanel.add(catButton); 

    add(radioPanel, BorderLayout.LINE_START); 
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 
} 

public void checkSelectedRadioButten(){ 

    System.out.println("selectedIndex = " + selectedIndex + "\ngroup.getSelectedButton() = " + group.getSelectedIndex()); 
    if(group.getSelectedIndex() == selectedIndex){ 
     hiddenButton.setSelected(true); 
     selectedIndex = -1; 
     System.out.println("getText = " + group.getSelectedButton().getText()); 
    }else{ 
     selectedIndex = group.getSelectedIndex(); 
     System.out.println("getText = " + group.getSelectedButton().getText()); 
    } 
} 

public static void main(String[] args) { 
    JFrame frame = new JFrame("RadioButtonDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JComponent newContentPane = new SelectUnselected(); 
    frame.setContentPane(newContentPane); 
    frame.pack(); 
    frame.setVisible(true); 

    } 
} 
1

Bạn có thể sử dụng một nhấp chuột truy cập:

private ButtonGroup radioGroup = new javax.swing.ButtonGroup(); 
private JRadioButton jRadioBtn1 = new javax.swing.JRadioButton(); 
private int clickCount = 0; 

private void jRadioBtn1Clicked(java.awt.event.MouseEvent evt) {            
    // Remove selection on a second click 
    if (jRadioBtn1.isSelected()) { 

     if (++clickCount % 2 == 0) { 

      radioGroup.clearSelection(); 
     } 
    } 
}