1

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

    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

4 回答 4

1

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

如果 Swing 是一个选项,您可以改用JRadioButtonMenuItemand ButtonGroup

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

}
于 2012-11-28T02:16:09.473 回答
1

您不能将 a 添加CheckboxGroup到菜单...您只能添加MenuItem实例。您可以添加一个CheckboxMenuItem,但这也不明白CheckboxGroup

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

像下面这样的东西应该可以工作:

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

这应该有效,因为ItemListeners 在代码调用时不会被调用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);
}
于 2012-11-28T02:11:44.813 回答
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

于 2015-05-04T01:43:12.503 回答
0

在 OSX Java 7 (1.7.0_40) 上,Julian 的回答不太有效,因为 ItemEvent 返回的对象实际上是一个字符串而不是 CheckBoxItem,这听起来像 OSX 中的一个错误,但通过修改 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;
    }
}
于 2013-11-20T09:59:31.303 回答