2012-03-28 50 views
1

我認爲證明這一點的最佳方式是使用可編譯的示例。我想要一組單選按鈕,其行爲如此(一次只能選擇一個按鈕);然而,噹噹前選定的單選按鈕再次被選中時,選擇被清除(就像我猜測的複選框)。我無法確定此JRadioButton功能的語義

我的實現檢查單選按鈕的狀態,如果選中,則清除選擇(模擬「取消選擇」就像複選框)。問題是,單選按鈕的選擇狀態在ActionEvent觸發之前發生變化,因此​​返回true,無論它是否已被選中。一種解決方案是在任何ActionEvent觸發之前基本上記錄ButtonGroup的選定按鈕,雖然我的程序不是這樣的通靈:我懷疑我可以很容易地使用MouseListener來實現這個,儘管這限制了鼠標使用的功能,而我可以使用鍵盤等:)感謝任何指針!

演示:

package sandbox; 

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JRadioButton; 

public class Sandbox { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     final ButtonGroup btns = new ButtonGroup(); 
     final JRadioButton btn1 = new JRadioButton("Button 1"); 
     final JRadioButton btn2 = new JRadioButton("Button 2"); 
     btns.add(btn1); 
     btns.add(btn2); 
     ActionListener al = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() instanceof JRadioButton) { 
        btns.clearSelection(); 
       } 
      } 

     }; 
     btn1.addActionListener(al); 
     btn2.addActionListener(al); 
     f.setLayout(new FlowLayout()); 
     f.add(btn1); 
     f.add(btn2); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 

} 
+0

http://docs.oracle.com/javase/tutorial/uiswing/components/button.html#radiobutton – assylias 2012-03-28 19:49:24

+0

如果你保存你只是做了,並檢查它下一次的方法被調用這不是心理。 – Thomas 2012-03-28 19:53:28

+0

這個用法是什麼?當你現在選擇一個單選按鈕時,你將再次清除選擇,這將使用戶感到挫敗。你確定無線電按鈕是要走的路嗎?爲什麼不選擇帶有'JCheckbox'實例的ButtonGroup? – Robin 2012-03-28 19:56:44

回答

2

如果在「項目事件」之後出現「操作事件」,那麼您需要結合項目監聽器和操作監聽器來實現此目的,即清除事件序列,即清除按鈕組的選擇時間。

以下代碼適用於我。

public class JRadioButtonTest { 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    final ButtonGroup btns = new ButtonGroup(); 
    final JRadioButton btn1 = new JRadioButton("Button 1"); 
    final JRadioButton btn2 = new JRadioButton("Button 2"); 
    btns.add(btn1); 
    btns.add(btn2); 
    EventAdapter ea = new EventAdapter(btns); 
    btn1.addActionListener(ea); 
    btn2.addActionListener(ea); 
    btn1.addItemListener(ea); 
    btn2.addItemListener(ea); 

    f.setLayout(new FlowLayout()); 
    f.add(btn1); 
    f.add(btn2); 
    f.pack(); 
    f.setLocationRelativeTo(null); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
} 

public static class EventAdapter implements ActionListener, ItemListener 
{ 
    private ButtonGroup bg; 

    boolean itemStateChanged = false; 

    public EventAdapter(ButtonGroup bg) 
    { 

     this.bg = bg; 
    } 


    @Override 
    public void itemStateChanged(ItemEvent itemEvent) { 
     itemStateChanged = true; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
      if (!itemStateChanged) 
      { 
       System.out.println("UnSelected"); 
       bg.clearSelection(); 
      } 
     itemStateChanged = false; 
    } 

} 

} 
+0

我一直在試圖將它們結合起來,但沒有成功。感謝您爲我放在一起:) – c24w 2012-03-28 21:48:22