BeansBinding1.2.1ではまだButtonGroupに対応してないらしい。

BeansBindingは、Beanのフィールドの値を同期するための仕組み。わりとswing用に使われることが多いみたいだけど、他の使い方もあるのかもしれない。

で、次のようなGUIで選んだラジオボタンの値をBeansBindingでテキストフィールドに表示しようとしたが、値が何もとれなかった。昔ながらのイベント処理(actionListenerの登録)だとうまくいくのに。

以下にGUIコンポーネントの初期化部分のソースコードを抜粋。ただし、レイアウト処理部分は省略。コードのほとんどはNetBeansGUIエディタで生成した。

    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        buttonGroup1 = new javax.swing.ButtonGroup();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        buttonGroup1.add(jRadioButton1);
        jRadioButton1.setText("ラジオボタンA");
        jRadioButton1.setActionCommand("AAA");
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButton2);
        jRadioButton2.setText("ラジオボタンB");
        jRadioButton2.setActionCommand("BBB");
        jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton2ActionPerformed(evt);
            }
        });

        buttonGroup1.add(jRadioButton3);
        jRadioButton3.setText("ラジオボタンC");
        jRadioButton3.setActionCommand("CCC");
        jRadioButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton3ActionPerformed(evt);
            }
        });

        jLabel1.setText("actionLisener:");

        jLabel2.setText("beansBinding:");

        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, buttonGroup1, org.jdesktop.beansbinding.ELProperty.create("${selection.actionCommand}"), jTextField2, org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

/// レイアウト処理部分を省略

        bindingGroup.bind();

        pack();
    }// </editor-fold>

おそらく、org.jdesktop.beansbinding.Bindings.createAutoBinding()でうまくバインディングが生成できてないんだと思う。

この場合、buttonGroup1のオブジェクトから、EL式「${selection.actionCommand}」でプロパティを読み出すように指定しているんだけど、何も値がとれない。

swingでバインディングできるクラスの一覧は、org.jdesktop.swingbindingパッケージのjavadocに記述されていて、swing部品から値を取得するときに実際に使われているクラスは、org.jdesktop.swingbinding.adaptersパッケージ内に存在している。
ここにButtonGroupに対するクラスが存在しないみたいなので、まだ対応していないのだと思う。

独自にBeanAdapterProviderインターフェースを継承したクラスを書いてやらなければいけないのかもしれない。