将复选框组添加到java菜单

时间:2012-11-28 01:42:58

标签: java checkbox awt jmenu

我试图在我的菜单中添加一个复选框组,但不断收到“无法找到符号”错误。

    MenuBar mb = new MenuBar();
    Menu file = new Menu("File");
    Menu colorM = new Menu("Color");
    MenuItem quitM = new MenuItem("Quit", new MenuShortcut(KeyEvent.VK_Q));
    CheckboxGroup cbg = new CheckboxGroup();
    Checkbox cb1 = new Checkbox("Black",cbg,true);
    Checkbox cb2 = new Checkbox("Red",cbg,false);
    Checkbox cb3 = new Checkbox("Blue",cbg,false);
    Checkbox cb4 = new Checkbox("Green",cbg,false);

然后在我的初始化中我有

    chatF.setMenuBar(mb);
    mb.add(file);
    mb.add(colorM);
    file.add(quitM);
    colorM.add(cbg);

我尝试添加一个MenuItem并将cbg放在那里,但同样的问题

4 个答案:

答案 0 :(得分:1)

您无法在菜单中添加CheckboxGroup ...您只能添加MenuItem个实例。您可以添加CheckboxMenuItem,但这也不了解CheckboxGroup

因此,您需要将CheckBox更改为CheckboxMenuItem,将它们单独添加到菜单中,滚动您自己的CheckboxMenuItemGroup类并使用它来绑定CheckboxMenuItem一起来。

以下内容应该有效:

public class CheckboxMenuItemGroup implements ItemListener {

    private Set<CheckboxMenuItem>   items = new HashSet<CheckboxMenuItem>();

    public void add(CheckboxMenuItem cbmi) {
        cbmi.addItemListener(this);
        cbmi.setState(false);
        items.add(cbmi);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            String itemAffected = (String) e.getItem();
            for (CheckboxMenuItem item : items) {
                // Use this line to allow user to toggle the selected item off
                if (!item.getLabel().equals(itemAffected)) item.setState(false);
                // Use this line to force one of the items to always be selected
                // item.setState(item.getLabel().equals(itemAffected));
            }
        }
    }

    public void selectItem(CheckboxMenuItem itemToSelect) {
        for (CheckboxMenuItem item : items) {
            item.setState(item == itemToSelect);
        }
    }

    public CheckboxMenuItem getSelectedItem() {
        for (CheckboxMenuItem item : items) {
            if (item.getState()) return item;
        }
        return null;
    }
}

这应该有效,因为只有当用户点击菜单中的项目时,才会在代码调用ItemListener时调用item.setState()。只需确保您只使用CheckboxMenuItemGroup.selectItem()调用设置项目的状态,否则您最终可能会选择多个项目。

然后你只需要建立这样的菜单:

public static void main(String[] args) {

    final Frame f = new Frame("Test CheckboxMenuItemGroup");
    MenuBar mb = new MenuBar();
    Menu menu = new Menu("Menu");
    CheckboxMenuItem cb1 = new CheckboxMenuItem("Black");
    CheckboxMenuItem cb2 = new CheckboxMenuItem("Red");
    CheckboxMenuItem cb3 = new CheckboxMenuItem("Blue");
    CheckboxMenuItem cb4 = new CheckboxMenuItem("Green");

    CheckboxMenuItemGroup mig = new CheckboxMenuItemGroup();
    mig.add(cb1);
    mig.add(cb2);
    mig.add(cb3);
    mig.add(cb4);
    mig.selectItem(cb1);

    menu.add(cb1);
    menu.add(cb2);
    menu.add(cb3);
    menu.add(cb4);

    f.setMenuBar(mb);

    f.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
    f.setSize(300, 200);
    f.setVisible(true);
}

答案 1 :(得分:1)

CheckboxGroup不是Component(或者更具体地说是MenuItem),因此您无法将其添加到菜单中。相反,您可以创建CheckboxMenuItem,但我认为CheckboxGroup仅适用于Checkbox的实例,因此您必须编写自己的代码以强制执行单选。

如果选择Swing,您可以使用JRadioButtonMenuItemButtonGroup

package com.example.checkboxmenu;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;

public class CheckboxMenu extends JFrame {

    public CheckboxMenu() {
        JMenuBar mb = new JMenuBar();
        JMenu file = new JMenu("File"); //$NON-NLS-1$
        JMenu colorM = new JMenu("Color");
        JMenuItem quitM = new JMenuItem("Quit", KeyEvent.VK_Q);

        JRadioButtonMenuItem cb1 = new JRadioButtonMenuItem("Black", true);
        JRadioButtonMenuItem cb2 = new JRadioButtonMenuItem("Red", true);
        JRadioButtonMenuItem cb3 = new JRadioButtonMenuItem("Blue", true);
        JRadioButtonMenuItem cb4 = new JRadioButtonMenuItem("Green", true);

        ButtonGroup group = new ButtonGroup();
        group.add(cb1);
        group.add(cb2);
        group.add(cb3);
        group.add(cb4);

        setJMenuBar(mb);
        mb.add(file);
        mb.add(colorM);
        file.add(quitM);
        colorM.add(cb1);
        colorM.add(cb2);
        colorM.add(cb3);
        colorM.add(cb4);

        quitM.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400,300);
        setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new CheckboxMenu();
    }

}

答案 2 :(得分:1)

使用swing而不是awt。

JMenuBar menuBar = new JMenuBar();
JMenu color = new JMenu("Color");

JCheckBoxMenuItem cb1 = new JCheckBoxMenuItem("Black");
JCheckBoxMenuItem cb2 = new JCheckBoxMenuItem("Red");
JCheckBoxMenuItem cb3 = new JCheckBoxMenuItem("Blue");
JCheckBoxMenuItem cb4 = new JCheckBoxMenuItem("Green");

ButtonGroup group = new ButtonGroup();
group.add(cb1);
group.add(cb2);
group.add(cb3);
group.add(cb4);

menuBar.add(cb1);
menuBar.add(cb2);
menuBar.add(cb3);
menuBar.add(cb4);

setJMenuBar(menuBar); // Set the JMenuBar of the JFrame

您可以将任何AbstractButton添加到ButtonGroup

答案 3 :(得分:0)

在OSX Java 7(1.7.0_40)上,Julian的回答并不是很有效,因为ItemEvent返回的对象实际上是一个String而不是CheckBoxItem,因此像OSX中的一个bug一样,但通过修改itemStateChanged方法使其工作

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashSet;
import java.util.Set;

public class CheckboxMenuItemGroup implements ItemListener
{

    private Set<CheckboxMenuItem> items = new HashSet<CheckboxMenuItem>();

    public void add(CheckboxMenuItem cbmi) {
        cbmi.addItemListener(this);
        cbmi.setState(false);
        items.add(cbmi);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {

            String itemAffected = (String)e.getItem();
            for (CheckboxMenuItem item : items) {
                if (item.getLabel() != itemAffected) item.setState(false);
            }
        }
    }

    public void selectItem(CheckboxMenuItem itemToSelect) {
        for (CheckboxMenuItem item : items) {
            item.setState(item == itemToSelect);
        }
    }

    public CheckboxMenuItem getSelectedItem() {
        for (CheckboxMenuItem item : items) {
            if (item.getState()) return item;
        }
        return null;
    }
}