Java SE 6 / Swing / ButtonGroup#clearSelection

Java SE 6 の

javax.swing.ButtonGroup

には

    /**
     * Clears the selection such that none of the buttons 
     * in the <code>ButtonGroup</code> are selected.
     * 
     * @since 1.6       
     */ 
    public void clearSelection() {

というメソッドが追加されていたらしい。

ButtonGroupクラスを使うと,ラジオボタンチェックボックスを排他的に選択できるようになります。つまり,あるボタンを選択すると他のボタンをすべて非選択状態にできます。

使い方は,単にButtonGroupオブジェクトを生成して,そこにボタン(AbstractButtonクラスを派生させたクラスのオブジェクト)をaddメソッドで追加するだけです。

簡単に使えて便利なのですが,反面,困ったことがありました。すべてのボタンを非選択状態に戻すことができなかったのです。

ButtonGroupクラスでボタンをまとめる場合,デフォルトの初期状態では,すべてのボタンが非選択状態になっています。

ところが,ボタンを1度でも選択してしまうと,簡単には初期状態に戻せないのです。

Java SE 6ではそれができるようになりました。

「Java SE 6完全攻略」第34回 Swingのその他の新機能 | 日経 xTECH(クロステック)

櫻庭さんの記事で知りました。4年前の記事*1なんですねぇ。

ウチの開発環境は、Java2SDK1.4.2*2なので、

group.clearSelection();

と書けませんorz

対策として、ButtonGroupのサブクラスを作り「見えないボタン」を追加しました。
櫻庭さんのJava SE 6用のサンプルを、勝手に1.4.2向けに書き直してみました。

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;

public class ButtonGroupSample {
  private MyButtonGroup group;

  public ButtonGroupSample () {
    JFrame frame1 = new JFrame("ButtonGroup Sample");
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container frame = frame1.getContentPane();

    frame.setLayout(new FlowLayout());
    
    final JRadioButton button1 = new JRadioButton("Selection 1");
    frame.add(button1);
    final JRadioButton button2 = new JRadioButton("Selection 2");
    frame.add(button2);
    final JRadioButton button3 = new JRadioButton("Selection 3");
    frame.add(button3);

    group = new MyButtonGroup();
    group.add(button1);
    group.add(button2);
    group.add(button3);
 
    JButton clearButton = new JButton("Clear Selection");
    clearButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        // 選択をクリアする
        group.clearSelection();
      }
    });
    frame.add(clearButton);

    frame1.pack();
    frame1.setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new ButtonGroupSample();
      }
    });
  }
}

class MyButtonGroup extends ButtonGroup {
  final JToggleButton _invisible = new JToggleButton("invisible");
  public MyButtonGroup() {
    super();
    add(_invisible);
  }
  public void clearSelection() {
    setSelected(_invisible.getModel(), true);
  }
}

*1:2007/06/25

*2:今年2011年にはJava SE 7が出るらしいのに。