在未选择单选按钮时调用ActionEvent

时间:2014-12-07 21:16:55

标签: java swing

我注意到即使在指定条件语句时,仍然会在JRadioButtonMenuItem组中触发ActionEvent:

if(!button.isSelected())
    //Do stuff

defaultTheme = new JRadioButtonMenuItem("Default theme");
    defaultTheme.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(!defaultTheme.isSelected())  
                System.out.println("temp");
        }
    });

我的设置菜单中有多个主题选项,但是如果已经选择了(例如默认),如果默认菜单已经存在,我不想执行任何冗余代码选中并且用户单击已选择的单选按钮。

2 个答案:

答案 0 :(得分:1)

ActionListener会在按钮被“操作”(点击,按下,无论如何)时告诉您,这并不总是会改变它的状态。相反,您可以将ItemListener附加到按钮模型,这将更准确地说明按钮的实际状态何时发生变化,例如......

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ButtonTest {

    public static void main(String[] args) {
        new ButtonTest();
    }

    public ButtonTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            ButtonGroup bg = new ButtonGroup();
            final JRadioButton bananas = new JRadioButton("Bananas");
            final JRadioButton apples = new JRadioButton("Apples");
            bg.add(bananas);
            bg.add(apples);

            bananas.getModel().addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    System.out.println("Bananas " + bananas.isSelected());
                }
            });
            apples.getModel().addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    System.out.println("Apples " + apples.isSelected());
                }
            });

            add(bananas, gbc);
            add(apples, gbc);

        }

    }

}

答案 1 :(得分:0)

不确定,因为我还没有看到你的程序的其余部分,但是你必须将所有的radiobutton放在一个ButtonGroup中。因为如果你不这样做就不可能取消选择无线电按钮。