1

これを実証する最良の方法は、コンパイル可能な例を使用することだと思いました。そのように動作するラジオボタンのグループが必要です(一度に選択できるのは1つだけです)。ただし、現在選択されているラジオボタンが再び「選択」されると、選択はクリアされます(私が推測するチェックボックスのように)。

私の実装では、ラジオボタンのステータスをチェックし、選択されている場合は、選択をクリアします(チェックボックスのように「選択解除」をエミュレートします)。問題は、ラジオボタンの選択状態が起動前に変化するためActionEventisSelected()すでに選択されているかどうかに関係なくtrueを返すことです。1つの解決策は、基本的に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);
    }

}
4

2 に答える 2

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;
    }

}

}
于 2012-03-28T21:11:10.310 に答える
1
于 2012-03-28T20:07:56.567 に答える